| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421 | #include "lwip/opt.h"#include "lwip/arch.h"#include "lwip/api.h"#include "lwip/tcp.h"#include "http_server.h"#include "web_params_api.h"#include "parameters.h"#include "urlcode.h"#include "trap_params.h"#include "fsdata.c"#include "settings_api.h"#include "netconf.h"#include "common_config.h"#include "testing.h"#include "rtc.h"#include "rng.h"#include "megatec.h"#include "log.h"#include "hal.h"#include "radius_user.h"#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <string.h>#include <stdlib.h>#include "FreeRTOS.h"#include "task.h"#include "fr_timers.h"static int fs_open(char *name, struct fs_file *file);static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len);static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len);static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len);static void http_sent_log_err(void * arg, err_t err);static void send_data(struct tcp_pcb *pcb, struct http_state *hs);static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len);static uint32_t Parse_Content_Length(char *data, uint32_t len);static void HTTP_SetUserCookie(char *str, uint8_t user_id);static void HTTP_UpdateUserLoginTime(uint8_t user_id);static void HTTP_ForceUserLogout(uint8_t user_id);void LogoutTimerCallback(TimerHandle_t pxTimer);int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);SET_PAGE_t SET_PAGE = SET_PAGE_IDLE;#define SEND_BUF_MAX_LEN   2000#define RECIVE_BUF_MAX_LEN   1500char sendBuf[SEND_BUF_MAX_LEN];uint16_t sendBufLoadLen = 0;uint16_t printLen = 0;//char printBuf[1000];char receiveBuf[RECIVE_BUF_MAX_LEN];uint16_t receivedBufLen = 0;#define MAX_POST_REQ_LEN 256char post_req_data[MAX_POST_REQ_LEN];uint32_t post_data_count;uint32_t log_post_reqn;/* Logout timeout, 30 minutes */#define WEB_LOGOUT_TIME  configTICK_RATE_HZ*60*30/* Max user active sessions count */#define WEB_USER_MAX_SESSION_COUNT  5typedef struct {    char cookie[MAX_WEB_COOKIE_LEN];    TimerHandle_t LogoutTimer;} auth_session_t;struct {    //auth_session_t session[WEB_USER_MAX_SESSION_COUNT];    char cookie[MAX_WEB_COOKIE_LEN];    TimerHandle_t LogoutTimer;} users[MAX_WEB_USERS];bool Authenticated = false;/* Level of currently logged-in user */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;static uint32_t ContentLengthOffset =0, BrowserFlag=0;static const char Content_Length[17] =/* Content Length */{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67,0x74, 0x68, 0x3a, 0x20, };const char HTTP_200_OK[] = "HTTP/1.1 200 OK\r\n\r\n";/* utf-8 marker to support MS Excel */const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF, 0x00};unsigned long log_ptr = 0;unsigned long log_size = 0;bool fLogTransInprog = false;static bool fl_raddius_net_err = false;/**  * @brief  Общая структура настроек  */extern SETTINGS_t sSettings;/**  * @brief  closes tcp connection  * @param  pcb: pointer to a tcp_pcb struct  * @param  hs: pointer to a http_state struct  * @retval  */static void close_conn(struct tcp_pcb *pcb, struct http_state *hs){  tcp_arg(pcb, NULL);  tcp_sent(pcb, NULL);  tcp_recv(pcb, NULL);  mem_free(hs);  tcp_close(pcb);}/**  * @brief callback function for handling TCP HTTP traffic  * @param arg: pointer to an argument structure to be passed to callback function  * @param pcb: pointer to a tcp_pcb structure  * @param p: pointer to a packet buffer  * @param err: LwIP error code  * @retval err  */static err_t http_recv(void *arg, struct tcp_pcb *pcb,  struct pbuf *p, err_t err){  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;  if (err == ERR_OK && p != NULL)  {    tcp_recved(pcb, p->tot_len);  	if (hs->file == NULL)    {      data = p->payload;/*	  	  printLen = p->tot_len;	  memcpy(printBuf, p->payload , printLen);	  printf(printBuf);*/	  	  receivedBufLen = p->tot_len;	  memcpy(receiveBuf, p->payload , receivedBufLen);	  receiveBuf[receivedBufLen] = '\0';	 // printf("receive %s \r\n", receiveBuf);	  /* Get cookie "uname" value */	  CookiePtr = strstr(receiveBuf, "uname=");	  strncpy(CookieBuf, CookiePtr, 50);	  //printf("********CookieBuf1= %s\r\n", CookieBuf);	  memset(name, 0, MAX_WEB_COOKIE_LEN);	  GetCookieValue(CookieBuf, "uname=", name, &nameLen);	  //printf("********CookieBuf2= %s\r\n", CookieBuf);	  //printf("********uname= %s\r\n", name);	   /* Get cookie "id" value */	   CookiePtr = strstr(receiveBuf, "id=");	   strncpy(CookieBuf, CookiePtr, 50);	   //printf("********CookieBuf1= %s\r\n", CookieBuf);	   memset(id, 0, MAX_WEB_COOKIE_LEN);	   GetCookieValue(CookieBuf, "id=", id, &idLen);	   //printf("********CookieBuf2= %s\r\n", CookieBuf);	   //printf("********id= %s\r\n", id);	   /* 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++) {		   HTTP_GetUserCookie(user_id, CookieBuf, &idLen);		   if (strncmp(id, CookieBuf, idLen) == 0 ) {			   GetUserLevelInt(user_id, &seclevel);			   Authenticated = true;			   break;		   }		   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);		  hs->file = sendBuf;		  hs->left = sendBufLoadLen;		  send_data(pcb, hs);		  tcp_sent(pcb, http_sent);	   }	   else if ( Authenticated == false )//&& sSettings.sRADIUS.Auth_enable == true	  {		  if (strncmp(data, "GET /main.css", 13) == 0) // +		  {			fs_open("/main.css", &file);			 hs->file = file.data;			 hs->left = file.len;			 send_data(pcb, hs);			 tcp_sent(pcb, http_sent);		  }		  else if (strncmp(data, "GET /rotek.png", 14) == 0) // +		  {			fs_open("/rotek.png", &file);			 hs->file = file.data;			 hs->left = file.len;			 send_data(pcb, hs);			 tcp_sent(pcb, http_sent);		  }		else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?		{			 fs_open("/favicon.ico", &file);			 hs->file = file.data;			 hs->left = file.len;			 send_data(pcb, hs);			 tcp_sent(pcb, http_sent);		}		else if (strncmp(data, "GET /role.js", 12) == 0)		{		  fs_open("/role.js", &file);		  hs->file = file.data;		  hs->left = file.len;		  send_data(pcb, hs);		  tcp_sent(pcb, http_sent);		}		  else if ((strncmp(data, "POST /login.cgi", 15) == 0) || (log_post_reqn > 0))			{			  uint32_t i, offset = 0, req_data_received = 0;			  //printf("request 1: %d\r\n", receivedBufLen);			  /* parse packet for Content-length field */			  post_data_count = Parse_Content_Length(data, p->tot_len);			  //printf("Content-length: %d\r\n", (int)post_data_count);			  if (post_data_count < MAX_POST_REQ_LEN) {				  memset(post_req_data, 0, MAX_POST_REQ_LEN);					/* parse packet for "\r\n\r\n" */					for (i = 0; i < receivedBufLen; i++)					{						if (strncmp ((char*)(data+i), "\r\n\r\n", 4) == 0)						{							offset = i+4;							//printf("offset: %d\r\n", (int)offset);							break;						}					}					req_data_received = receivedBufLen - offset;					//printf("req data received: %d\r\n", (int)req_data_received);					/* Check if "\r\n\r\n" was found */					if (offset != 0) {						/* if data was splited in two packets */						if (req_data_received < post_data_count) {							/* Copy request data to buffer */							snprintf(post_req_data, req_data_received, "%s", receiveBuf);							//printf("copied: %d\r\n", (int)req_data_received);							post_data_count -= req_data_received;						}						/* if data received completely */						else {							strncat(post_req_data, (char *)(data + offset), post_data_count);							//printf("post_req_data: %s\r\n", post_req_data);							if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) {								  hs->file = sendBuf;								  hs->left = sendBufLoadLen;								  send_data(pcb, hs);								  tcp_sent(pcb, http_sent);							}							else {								/* Redirect to login page */								fs_open("/login.html", &file);								hs->file = file.data;								hs->left = file.len;								send_data(pcb, hs);								tcp_sent(pcb, http_sent);							}							/* End reqest */							post_data_count = 0;							log_post_reqn = 0;						}					}					/* request was fragmented before "\r\n\r\n" */					else {						//printf("no data found!\r\n");						/* wait next packet */						log_post_reqn++;						/* wait max 2 requests */						if (log_post_reqn > 1) {							/* Redirect to login page */							fs_open("/login.html", &file);							hs->file = file.data;							hs->left = file.len;							send_data(pcb, hs);							tcp_sent(pcb, http_sent);								/* End reqest */							post_data_count = 0;							log_post_reqn = 0;						}					}			  }			  else {				  printf("Too long POST request!\r\n");				  /* Ignore request */				  post_data_count = 0;				  log_post_reqn = 0;					/* Redirect to login page */					fs_open("/login.html", &file);					hs->file = file.data;					hs->left = file.len;					send_data(pcb, hs);					tcp_sent(pcb, http_sent);			  }			}			  else if (post_data_count > 0)				{				  strncat(post_req_data, data, post_data_count);				  //printf("copied: %d\r\n", (int)post_data_count);				  //printf("post_req_data: %s\r\n", post_req_data);				  if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES) {						hs->file = sendBuf;						hs->left = sendBufLoadLen;						send_data(pcb, hs);						tcp_sent(pcb, http_sent);				  }				  else {					  /* Redirect to login page */					  fs_open("/login.html", &file);					  hs->file = file.data;					  hs->left = file.len;					  send_data(pcb, hs);					  tcp_sent(pcb, http_sent);				  }				  /* End reqest */				  post_data_count = 0;				  log_post_reqn = 0;				}		  else		  {			  fs_open("/login.html", &file);			  hs->file = file.data;			  hs->left = file.len;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);		  }	  }	  else if ( Authenticated == true ) {	  if (strncmp(data, "GET /main.css", 13) == 0) // +	  {	    fs_open("/main.css", &file);        hs->file = file.data;        hs->left = file.len;        send_data(pcb, hs);        tcp_sent(pcb, http_sent);	  }	  else if (strncmp(data, "GET /rotek.png", 14) == 0) // +	  {	    fs_open("/rotek.png", &file);        hs->file = file.data;        hs->left = file.len;        send_data(pcb, hs);        tcp_sent(pcb, http_sent);	  }      else if (strncmp(data, "GET /favicon.ico", 16) == 0) // ?                       {                                                                             fs_open("/favicon.ico", &file);                                             hs->file = file.data;                                                       hs->left = file.len;                                                        send_data(pcb, hs);                                                         tcp_sent(pcb, http_sent);                                                 }	  else if (strncmp(data, "GET /main.js", 12) == 0) // +	  {	    fs_open("/main.js", &file);        hs->file = file.data;        hs->left = file.len;        send_data(pcb, hs);        tcp_sent(pcb, http_sent);			  }	  else if (strncmp(data, "GET /role.js", 12) == 0)	  {		fs_open("/role.js", &file);		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  else if (strncmp(data, "GET /settings.html", 18) == 0) // +	  {		HTTP_UpdateUserLoginTime(user_id);		if (seclevel == 0){			fs_open("/settings.html", &file);			hs->file = file.data;			hs->left = file.len;			send_data(pcb, hs);			tcp_sent(pcb, http_sent);		}		else {			fs_open("/index.html", &file);			hs->file = file.data;			hs->left = file.len;			send_data(pcb, hs);			tcp_sent(pcb, http_sent);		}	  }	  else if (strncmp(data, "GET /info.html", 14) == 0) // +	  {		HTTP_UpdateUserLoginTime(user_id);	    fs_open("/info.html", &file);        hs->file = file.data;        hs->left = file.len;        send_data(pcb, hs);        tcp_sent(pcb, http_sent);	  }	  else if (strncmp(data, "GET /history.html", 17) == 0)	  {		HTTP_UpdateUserLoginTime(user_id);		fs_open("/history.html", &file);		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  else if (strncmp(data, "GET /ups_history.html", 21) == 0)	  {		HTTP_UpdateUserLoginTime(user_id);		fs_open("/ups_history.html", &file);		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  else if (strncmp(data, "GET /getJson.cgi", 16) == 0) // +	  {		HTTP_GetParamsPage1(sendBuf);		hs->file = sendBuf;        hs->left = strlen(sendBuf);		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  	  else if (strncmp(data, "GET /settings.cgi", 17) == 0) // +	  {		if (seclevel == 0) {			SET_PAGE = SET_PAGE_PAGE2;			if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)			{			  hs->file = sendBuf;			  hs->left = sendBufLoadLen;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);			}			/*else			{			  fs_open("/settings.html", &file);			  hs->file = file.data;			  hs->left = file.len;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);			}*/		}	  }	  else if (strncmp(data, "POST /settings.cgi", 18) == 0  || (DataFlag2 >= 1))	  {		  if (seclevel == 0) {			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(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) // +	  {			if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)			{			  hs->file = sendBuf;			  hs->left = sendBufLoadLen;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);			}		/*	else			{			  fs_open("/info.html", &file);			  hs->file = file.data;			  hs->left = file.len;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);			}*/	  }	  else if (strncmp(data, "POST /info.cgi", 14) == 0 || (DataFlag >= 1))	  {		  if (seclevel == 0) {			DataOffset = 0;			/* 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);			   }			 }		  }	  }	  else if (strncmp(data, "GET /history.cgi", 16) == 0)		{		  int res;		  res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		  if (res == SEND_REQUIRED_FILE)		  {			  hs->file = sendBuf;			  hs->left = sendBufLoadLen;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent_history);			  tcp_err(pcb, http_sent_log_err);		  }		  else if (res == SEND_REQUIRED_YES) {			  hs->file = sendBuf;			  hs->left = sendBufLoadLen;			  send_data(pcb, hs);			  tcp_sent(pcb, http_sent);		  }		}	else if (strncmp(data, "GET /ups_history.cgi", 19) == 0)	{	  int res;	  res = HTTP_UpsHistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);	  if (res == SEND_REQUIRED_FILE)	  {		  hs->file = sendBuf;		  hs->left = sendBufLoadLen;		  send_data(pcb, hs);		  tcp_sent(pcb, http_sent_log);		  tcp_err(pcb, http_sent_log_err);	  }	  else if (res == SEND_REQUIRED_YES) {		  hs->file = sendBuf;		  hs->left = sendBufLoadLen;		  send_data(pcb, hs);		  tcp_sent(pcb, http_sent);	  }	}	  /* Тест  АКБ ИБП */	  else if (strncmp(data, "GET /bat_test.cgi", 17) == 0)	  {		HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		hs->file = sendBuf;		hs->left = sendBufLoadLen;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  /* Выключение ИБП */	  else if (strncmp(data, "GET /ups_power.cgi", 18) == 0)	  {		HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		hs->file = sendBuf;		hs->left = sendBufLoadLen;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  /* Сброс настроек и сохранине */	  else if (strncmp(data, "GET /reset.cgi", 14) == 0)	  {		HTTP_ResetSettings();		HTTP_SaveSettings();		fs_open("/settings.html", &file);		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  /* Перезагрузка контроллера */	  else if (strncmp(data, "GET /reboot.cgi", 15) == 0)	  {		HTTP_Reboot();	  }	  /* Подтверждение новых сетевых настроек */	  else if (strncmp(data, "GET /confirm.cgi", 16) == 0)	  {		SetWebReinitFlag(false);		SetConfirmWebParamsFlag();		fs_open("/index.html", &file);		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  /* Проверка пароля, переход в bootloader */	  else if (strncmp(data, "GET /fw_update.cgi", 18) == 0)	  {		HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		hs->file = sendBuf;		hs->left = sendBufLoadLen;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  /* Смена пароля пользователя */	  else if (strncmp(data, "GET /changepwd.cgi", 18) == 0)	  {		  HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		  hs->file = sendBuf;		  hs->left = sendBufLoadLen;		  send_data(pcb, hs);		  tcp_sent(pcb, http_sent);	  }	  // На производстве	  else if (strncmp(data, "GET /setProdate.cgi", 19) == 0)	  {		HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);		hs->file = sendBuf;		hs->left = sendBufLoadLen;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	  else	  {		HTTP_UpdateUserLoginTime(user_id);		fs_open("/index.html", &file); // +		hs->file = file.data;		hs->left = file.len;		send_data(pcb, hs);		tcp_sent(pcb, http_sent);	  }	}    }    pbuf_free(p);   // close_conn(pcb,hs);  }/*  if (err == ERR_OK && p == NULL)  {    close_conn(pcb, hs);  }*/  return ERR_OK;} /**  * @brief Error callback for log file transfer  */static void http_sent_log_err(void * arg, err_t err){    (void)err;    (void)arg;    /* Clear file transfer in progress flag */    fLogTransInprog = false;}/**  * @brief Sent callback for log file transfer (messages as is, not ordered)  */static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len){  struct http_state *hs;  uint32_t nbytes = 0;  static bool start = true;  (void)len;  hs = arg;  if (hs->left > 0)  {    send_data(pcb, hs);  }  else  {	  memset(logFileBuf, 0, FILE_BUF_MAX_LEN);      if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {          nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);      }      else if (log_ptr < log_size) {          nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);      }      else {          nbytes = 0;      }      log_ptr += nbytes;      start = false;      if (nbytes == 0) {          /* File transfer finished. */          start = true;          close_conn(pcb, hs);          /* Clear file transfer in progress flag */          fLogTransInprog = false;          return ERR_OK;      }      hs->file = logFileBuf;      hs->left = nbytes;      send_data(pcb, hs);      tcp_sent(pcb, http_sent_log);  }  return ERR_OK;}/**  * @brief Sent callback for log file transfer (messages as is, not ordered)  */static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len){  struct http_state *hs;  uint32_t nbytes = 0;  static bool start = true;  (void)len;  hs = arg;  if (hs->left > 0)  {    send_data(pcb, hs);  }  else  {	  memset(logFileBuf, 0, FILE_BUF_MAX_LEN);      if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {          nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);      }      else if (log_ptr < log_size) {          nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);      }      else {          nbytes = 0;      }      log_ptr += nbytes;      start = false;      if (nbytes == 0) {          /* File transfer finished. */          start = true;          close_conn(pcb, hs);          /* Clear file transfer in progress flag */          fLogTransInprog = false;          return ERR_OK;      }      hs->file = logFileBuf;      hs->left = nbytes;      send_data(pcb, hs);      tcp_sent(pcb, http_sent_history);  }  return ERR_OK;}/**  * @brief  callback function for handling connection errors  * @param  arg: pointer to an argument to be passed to callback function  * @param  err: LwIP error code     * @retval none  */static void conn_err(void *arg, err_t err){  struct http_state *hs;  hs = arg;  mem_free(hs);}/**  * @brief callback function called after a successfull TCP data packet transmission    * @param arg: pointer to an argument to be passed to callback function  * @param pcb: pointer on tcp_pcb structure  * @param len  * @retval err : LwIP error code  */static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len){  struct http_state *hs;  hs = arg;  if (hs->left > 0)  {    send_data(pcb, hs);  }  else  {    close_conn(pcb, hs);        }  return ERR_OK;}/**  * @brief sends data found in  member "file" of a http_state struct  * @param pcb: pointer to a tcp_pcb struct  * @param hs: pointer to a http_state struct  * @retval none  */static void send_data(struct tcp_pcb *pcb, struct http_state *hs){  err_t err;  u16_t len;  /* We cannot send more data than space available in the send     buffer */  if (tcp_sndbuf(pcb) < hs->left)  {    len = tcp_sndbuf(pcb);  }  else  {    len = hs->left;  }  err = tcp_write(pcb, hs->file, len, 0);  if (err == ERR_OK)  {    hs->file += len;    hs->left -= len;  }}/**  * @brief tcp poll callback function  * @param arg: pointer to an argument to be passed to callback function  * @param pcb: pointer on tcp_pcb structure  * @retval err_t  */static err_t http_poll(void *arg, struct tcp_pcb *pcb){  if (arg == NULL)  {    tcp_close(pcb);  }  else  {    send_data(pcb, (struct http_state *)arg);  }  return ERR_OK;}/**  * @brief  callback function on TCP connection setup ( on port 80)  * @param  arg: pointer to an argument structure to be passed to callback function  * @param  pcb: pointer to a tcp_pcb structure  * ¶m  err: Lwip stack error code  * @retval err  */static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err){  struct http_state *hs;  /* Allocate memory for the structure that holds the state of the connection */  hs = mem_malloc(sizeof(struct http_state));  if (hs == NULL)  {    return ERR_MEM;  }  /* Initialize the structure. */  hs->file = NULL;  hs->left = 0;  /* Tell TCP that this is the structure we wish to be passed for our     callbacks. */  tcp_arg(pcb, hs);  /* Tell TCP that we wish to be informed of incoming data by a call     to the http_recv() function. */  tcp_recv(pcb, http_recv);  tcp_err(pcb, conn_err);  tcp_poll(pcb, http_poll, 10);  return ERR_OK;}/**  * @brief  Opens a file defined in fsdata.c ROM filesystem   * @param  name : pointer to a file name  * @param  file : pointer to a fs_file structure    * @retval  1 if success, 0 if fail  */static int fs_open(char *name, struct fs_file *file){  struct fsdata_file_noconst *f;  for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)  {    if (!strcmp(name, f->name))    {      file->data = f->data;      file->len = f->len;      return 1;    }  }  return 0;}/**  * @brief  Initialize the HTTP server (start its thread)   * @param  none  * @retval None  */void HTTP_Init(){	char buf[MAX_WEB_COOKIE_LEN];	  uint8_t user_id;  //sys_thread_new("HTTP", http_server_netconn_thread, NULL, 3000, 2);  struct tcp_pcb *pcb;  /*create new pcb*/  pcb = tcp_new();  /* bind HTTP traffic to pcb */  tcp_bind(pcb, IP_ADDR_ANY, 80);  /* start listening on port 80 */  pcb = tcp_listen(pcb);  /* define callback function for TCP connection setup */  tcp_accept(pcb, http_accept);  for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {     /* Flush user cookie by random value */     sprintf(buf, "%X", (unsigned int)GetRandomNumber());     HTTP_SetUserCookie(buf, user_id);     /* Create user logout timers */     users[user_id].LogoutTimer =             xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);   }}/**  * @brief    * @retval None  */int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  char tempStr[30];  strncpy(tempStr, bufIn, 30);    /* В запросе нет параметров, нужно формировать JSON ответ */  if (strpbrk(tempStr,"?") == 0)  {	memset(bufOut, 0, SEND_BUF_MAX_LEN);		HTTP_GetSettings(bufOut);	    //printf(bufOut);        *lenBufOut = strlen(bufOut);		return SEND_REQUIRED_YES;  }  /* В запросе есть параметры, нужно парсить и сохранять настройки */  else  {	//HTTP_SetSettings(bufIn, lenBufIn);	    return SEND_REQUIRED_NO;  }}/**  * @brief    * @retval None  */int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  char tempStr[30];  strncpy(tempStr, bufIn, 30);    /* В запросе нет параметров, нужно формировать JSON ответ */  if (strpbrk(tempStr,"?") == 0)  {	memset(bufOut, 0, SEND_BUF_MAX_LEN);		HTTP_GetInfo(bufOut);		    *lenBufOut = strlen(bufOut);		return SEND_REQUIRED_YES;  }  /* В запросе есть параметры, нужно парсить и сохранять настройки */  else  {	//HTTP_SetInfo(bufIn, lenBufIn);	return SEND_REQUIRED_NO;/*		HTTP_SetSettings(bufIn, lenBufIn);    return SEND_REQUIRED_NO;*/	  }}  int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  uint8_t i, valueLen = 0;  char value[20];  uint32_t nbytes = 0;  (void)lenBufIn;  memset(bufOut, 0, FILE_BUF_MAX_LEN);  ClearParamString(bufIn);  memset(value, 0, 20);  GetParamValue(bufIn, "page=", value, &valueLen);  if (strcmp(value, "all") == 0)  {	  if (!LOG_IsInit()) {		  return SEND_REQUIRED_NO;	  }      if (fLogTransInprog == false) {        // Send log as raw data        log_ptr = 0;        log_size = History_GetTotalSTRCount() * STRING_SIZE_HISTORY + sizeof(UTF8_BOM)-1;        sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);        *lenBufOut = strlen(bufOut);        // Set file transfer in progress flag        fLogTransInprog = true;        return SEND_REQUIRED_FILE;     }     else {          // We send nothing if file transfer already in progress          return SEND_REQUIRED_NO;     }  }  else {	  if (!LOG_IsInit()) {		  return SEND_REQUIRED_NO;	  }	  else {		  HTTP_GetHistoryPage(bufOut, atoi(value));		  *lenBufOut = strlen(bufOut);		  return SEND_REQUIRED_YES;	  }  }}int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  uint8_t i, valueLen = 0;  char value[20];  uint32_t nbytes = 0;  (void)lenBufIn;  memset(bufOut, 0, FILE_BUF_MAX_LEN);  ClearParamString(bufIn);  memset(value, 0, 20);  GetParamValue(bufIn, "page=", value, &valueLen);  if (strcmp(value, "all") == 0)  {	  if (!LOG_IsInit()) {		  return SEND_REQUIRED_NO;	  }      if (fLogTransInprog == false) {        // Send log as raw data        log_ptr = 0;        log_size = LOG_GetTotalSTRCount() * STRING_SIZE + sizeof(UTF8_BOM)-1;        sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);        *lenBufOut = strlen(bufOut);        // Set file transfer in progress flag        fLogTransInprog = true;        return SEND_REQUIRED_FILE;     }     else {          // We send nothing if file transfer already in progress          return SEND_REQUIRED_NO;     }  }  else {	  if (!LOG_IsInit()) {		  return SEND_REQUIRED_NO;	  }	  else {		  HTTP_GetUpsHistoryPage(bufOut, atoi(value));		  *lenBufOut = strlen(bufOut);		  return SEND_REQUIRED_YES;	  }  }}  /**  * @brief  Установка даты производства  */// TODO Убрать заглушку!void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  uint8_t valueLen = 0;  char value[20];    memset(bufOut, 0, SEND_BUF_MAX_LEN);    ClearParamString(bufIn);    memset(value, 0, 20);  GetParamValue(bufIn, "prodate=", value, &valueLen);  /*  printf("Prodate: ");  printf(value);  printf("\r\n");  */    /* Устанавливаем дату производства */  SETTINGS_SetProDate(value, valueLen);    /* Пока отправляем true */  strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\nTrue");  *lenBufOut = strlen(bufOut);    TEST_SetServerFlag();}/**  * @brief    * @retval None  */void HTTP_SetSettings(char *buf, uint16_t lenBuf){  uint8_t valueLen = 0;  const uint8_t len = MAX_WEB_PARAM_LEN;  char value[MAX_WEB_PARAM_LEN];  char str[MAX_WEB_PARAM_LEN];  //printf(buf);    //ClearParamString(buf);    memset(value, 0, len);  memset(str, 0, MAX_WEB_PARAM_LEN);    /* SNMP */  GetParamValue(buf, "read_community=", value, &valueLen);  SetReadCommunity(value);  memset(value, 0, len);    GetParamValue(buf, "write_community=", value, &valueLen);  SetWriteCommunity(value);  memset(value, 0, len);        GetParamValue(buf, "managerIP=", value, &valueLen);  SetManagerIp(value);  memset(value, 0, len);  GetParamValue(buf, "managerIP2=", value, &valueLen);  SetManagerIp2(value);  memset(value, 0, len);  GetParamValue(buf, "managerIP3=", value, &valueLen);  SetManagerIp3(value);  memset(value, 0, len);    GetParamValue(buf, "managerIP4=", value, &valueLen);  SetManagerIp4(value);  memset(value, 0, len);  GetParamValue(buf, "managerIP5=", value, &valueLen);  SetManagerIp5(value);  memset(value, 0, len);  /* Сетевые параметры */  GetParamValue(buf, "dhcp=", value, &valueLen);  SetDhcpStateStr(value);    if (strncmp(value, "on", 2) != 0)  // Если dhcp off устанавливаем параметры    {    memset(value, 0, len);    GetParamValue(buf, "ipaddr=", value, &valueLen);    SetIPStr(value);    memset(value, 0, len);      GetParamValue(buf, "gw=", value, &valueLen);    SetGatewayStr(value);    memset(value, 0, len);      GetParamValue(buf, "mask=", value, &valueLen);    SetMaskStr(value);    memset(value, 0, len);  }  memset(value, 0, len);  GetParamValue(buf, "swauth=", value, &valueLen);  SetAuthEnableStateStr(value);  if (strncmp(value, "on", 2) == 0){		/* параметры RADIUS*/	  memset(value, 0, len);		GetParamValue(buf, "rs_enabled=", value, &valueLen);		SetRDSEnableStateStr(value);		if (strncmp(value, "on", 2) == 0)  // Если raddius off устанавливаем параметры		{			memset(value, 0, len);			GetParamValue(buf, "rs_server=", value, &valueLen);			SetRDSIpStr(value);			memset(value, 0, len);			GetParamValue(buf, "rs_port=", value, &valueLen);			SetRDSPortStr(value);			memset(value, 0, len);			GetParamValue(buf, "rs_pwd=", value, &valueLen);			SetRDSPasswordkStr(value);			memset(value, 0, len);			GetParamValue(buf, "rs_key=", value, &valueLen);			SetRDSKeyAccesstStr(value);			memset(value, 0, len);		}  }  memset(value, 0, len);  // Параметры реле и сухих контактов  GetParamValue(buf, "di1=", value, &valueLen);  SetDINTypeActStr(value, 0);  memset(value, 0, len);  GetParamValue(buf, "ro1=", value, &valueLen);  SetROTypeActStr(value, 0);  memset(value, 0, len);  GetParamValue(buf, "ro2=", value, &valueLen);  SetROTypeActStr(value, 1);  memset(value, 0, len);  // Параметры даты и времени  GetParamValue(buf, "ntp=", value, &valueLen);  SetSntpStateStr(value);  if (strncmp(value, "1", 1) == 0)  // Если ntp on устанавливаем параметры  {    memset(value, 0, len);    GetParamValue(buf, "ntpservip=", value, &valueLen);    SetSntpServerIpStr(value);    memset(value, 0, len);  }  else if (strncmp(value, "0", 1) == 0){      GetParamValue(buf, "date=", value, &valueLen);      SetDateStr(value);      memset(value, 0, len);      GetParamValue(buf, "time=", value, &valueLen);      url_decode(str, sizeof(str), value);      SetTimeStr(str);      memset(value, 0, len);  }  GetParamValue(buf, "utc=", value, &valueLen);  SetSntpTimeZoneStr(value);  memset(value, 0, len);    /* Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся */  if (GetStateWebReinit() == true)  {		SetWebReinitFlag(true);	HTTP_SaveSettings();    /* Блокируем управление ключем на тау секунд*/    //IO_KeyBlockOn();    vTaskDelay(1010);    Reboot();  }	    HTTP_SaveSettings();}/**  * @brief    * @retval None  */void HTTP_SetInfo(char *buf, uint16_t lenBuf){  uint8_t valueLen = 0;  const uint8_t len = 110;  char value[110];  char str[110]; // ClearParamString(buf);    memset(value, 0, len);    /* Владелец */  GetParamValue(buf, "owner=", value, &valueLen);  url_decode(str, sizeof(str), value);  SetOwner(str);  memset(value, 0, len);    /* Владелец */  GetParamValue(buf, "sysLocation=", value, &valueLen);  url_decode(str, sizeof(str), value);  SetLocation(str);  memset(value, 0, len);    /* Комментарий */  GetParamValue(buf, "comment=", value, &valueLen);  url_decode(str, sizeof(str), value);  SetComment(str);  memset(value, 0, len);   HTTP_SaveSettings();}/**  * @brief  Запуск/останов теста UPS  */void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){	  uint8_t valueLen = 0;	  char tempValue[20];	  char tempValue2[20];	  int8_t res = 0;	  char log_string[50];	  memset(tempValue, 0, 20);	  memset(tempValue2, 0, 20);	  memset(log_string, 0,50);	  strcpy(bufOut, HTTP_200_OK);	  GetParamValue(bufIn, "func=", tempValue, &valueLen);	  if (strcmp(tempValue, "stop") == 0){		  res = ups_metac_service_pdu(ups_cancel_test);		  if(res == 1 || res == 0){			  strcat(bufOut, "Тест остановлен!");			  strcpy(log_string, name_login);			  strcat(log_string, " (Останов)");			  log_event_data(LOG_TEST_UPS, log_string);		  }		  if(res == -1)			  strcat(bufOut, "Тест не удалось остановить!");		  *lenBufOut = strlen(bufOut);	  }	  else if (strcmp(tempValue, "discharge") == 0){		  res = ups_metac_service_pdu(ups_test_low_bat);		  if(res == 1 || res == 0){			  strcat(bufOut, "Тест запущен!");			  strcpy(log_string, name_login);			  strcat(log_string, " (Запущен)");			  log_event_data(LOG_TEST_UPS, log_string);		  }		  if(res == -1)			  strcat(bufOut, "Тест не удалось запустить!");		  *lenBufOut = strlen(bufOut);	  }	  else if (strncmp(tempValue, "time", 6) == 0){		  GetParamValue(bufIn, "=", tempValue2, &valueLen);		  TimeParam = atoi(tempValue2);		  res = ups_metac_service_pdu(ups_test_time);		  if(res == 1 || res == 0){			  strcat(bufOut, "Тест запущен!");			  strcpy(log_string, name_login);			  strcat(log_string, " (Запущен)");			  log_event_data(LOG_TEST_UPS, log_string);		  }		  if(res == -1)			  strcat(bufOut, "Тест не удалось запустить!");		  *lenBufOut = strlen(bufOut);	  }}/**  * @brief  Выклюение UPS  */void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){	  uint8_t valueLen = 0;	  char *valueLenEnd = 0;	  char tempValue[50];	  char tempValue2[50];	  int8_t res = 0;	  char log_string[50];	  memset(tempValue, 0, 50);	  memset(log_string, 0,50);	  strcpy(bufOut, HTTP_200_OK);	  GetParamValue(bufIn, "func=", tempValue, &valueLen);	  if (strcmp(tempValue, "reboot") == 0){		  res = ups_metac_service_pdu(ups_cancel_shut_down);		  if(res == 1){			  strcpy(log_string, name_login);			  strcat(log_string, " (Останов)");			  log_event_data(LOG_SHUTDOWN_UPS, log_string);			  strcat(bufOut, "Выключение нагрузки ИБП отменено!");		  }		  else			  strcat(bufOut, "Выключение нагрузки ИБП не удалось отменить!");		  *lenBufOut = strlen(bufOut);	  }	  else if (strncmp(tempValue, "off", 5) == 0){		  memset(tempValue2, 0, 50);		  GetParamValue(bufIn, "after=", tempValue2, &valueLen);		  TimeParamFloat = atof(tempValue2);		  res = ups_metac_service_pdu(ups_shutdown);		  if(res == 1){			  strcat(bufOut, "Отключение нагрузки ИБП!");			  log_event_data(LOG_SHUTDOWN_UPS, name_login);		  }else			  strcat(bufOut, "Отключение нагрузки ИБП не удалось!");		  *lenBufOut = strlen(bufOut);	  }}/**  * @brief  Проверка пароля для перехода в режим bootloader  * @retval None  */void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){  char tempStr[50];  strncpy(tempStr, bufIn, 50);  char value[20];  uint8_t valueLen;    memset(value, 0, 20);    //if (GetParamValue(tempStr, "password=", value, &valueLen))  {	//if (strcmp(BOOTLOADER_PASWORD, value) == 0)	{  	 // *bufOut = '1';	  /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть       отправить ответ серверу о статусе пароля */	  HTTP_StartResetTask(true); 	}  /*	else	  *bufOut = '0';*/		//*lenBufOut = 1;  }}/**  * @brief  Проверка пароля для входа в Web  * @retval None  */int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){	  char tempStr[50];	  char login[20];	  char password[20];	  uint8_t valueLen, user_id;	  char *strPtr = 0;	  char WebPassword[MAX_WEB_PASSWD_LEN];	  char WebLogin[MAX_WEB_LOGIN_LEN];	  memset(login, 0, 20);	  memset(password, 0, 20);	  memset(tempStr, 0, 50);	  memset(name_login, 0, 50);	  /* Get first 50 bytes of string */	  strncpy(tempStr, bufIn, 49);	  /* Add " " to the string in order GetParamValue() can be able to parse the param */	  strcat(tempStr, " ");	  GetParamValue(tempStr, "login=", login, &valueLen);	  GetParamValue(tempStr, "password=", password, &valueLen);	  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;		        	break;		        }		        else{		        	Authenticated = false;		        }		  }	  }	  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");		  *lenBufOut = strlen(bufOut);		  if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){			  snprintf(name_login, (strlen(login)+1), login);		  }		  else{			  fl_raddius_net_err = false;			  switch (user_id) {				  case 0:					  snprintf(name_login, sizeof(name_login), "Администратор");					  break;				  case 1:					  snprintf(name_login, sizeof(name_login), "Пользователь");					  break;				  default:					  snprintf(name_login, (strlen(login)+1), login);					  break;			  }		  }		  log_event_data(LOG_LOGIN, name_login);		  /* Запускаем задачу-таймер логаута. */		  /* 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){	char tempStr[50];	uint8_t valueLen;	char WebLogin[MAX_WEB_LOGIN_LEN];	GetUserLogin(ADMIN, WebLogin, &valueLen);	memset(tempStr, 0, 50);	memset(name_login, 0, 50);	/* TODO replace global flag with user-pass-cookie */	Authenticated = true;	/* Generate cookie */	sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());	/* Set users cookie */	HTTP_SetUserCookie(tempStr, ADMIN);	HTTP_UpdateUserLoginTime(ADMIN);	/* 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);	strcat(bufOut, "\r\nSet-Cookie: role=0");	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);	snprintf(name_login, sizeof(name_login), "Администратор");}/**  * @brief    * @retval None  */uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen){  char *beginValue = 0;  char *endValue = 0;  int  len = 0;  char *strPtr = 0;    strPtr = strstr(inStr, paramName);    if (strPtr != 0)  {    beginValue = strpbrk(strPtr,"=");    endValue = strpbrk(strPtr,"&");    if (endValue == 0)      endValue = strpbrk(strPtr," ");    len = endValue - beginValue - 1;    strncpy(paramValue, beginValue + 1, len);    *endValue = '0';    *beginValue = '0';	*paramLen = len;	return 1;  }  else  {		*paramLen = 0;	return 0;  }}/**  * @brief    * @retval None  */uint8_t GetCookieValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen){  char *beginValue = 0;  char *endValue = 0;  int  len = 0;  char *strPtr = 0;  strPtr = strstr(inStr, paramName);  if (strPtr != 0)  {    beginValue = strpbrk(strPtr,"=");    endValue = strpbrk(strPtr,";");    if (endValue == 0)      endValue = strpbrk(strPtr,"\n");    len = endValue - beginValue - 1;    strncpy(paramValue, beginValue + 1, len);    *endValue = '0';    *beginValue = '0';    *paramLen = len;    return 1;  }  else  {    *paramLen = 0;    return 0;  }}/**  * @brief  * @retval None  *//*uint8_t GetParamValueInEnd(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen){  char *beginValue = 0;  char *endValue = 0;  int  len = 0;  char *strPtr = 0;    strPtr = strstr(inStr, paramName);    if (strPtr != 0)  {    beginValue = strpbrk(strPtr,"=");    endValue = strpbrk(strPtr," ");    len = endValue - beginValue - 1;    strncpy(paramValue, beginValue + 1, len);    *endValue = '0';    *beginValue = '0';	*paramLen = len;	return 1;  }  else  {		*paramLen = 0;	return 0;  }}*/void ClearParamString(char *inBuf){  uint16_t len;  char *str;    str = strstr(inBuf, "HTTP");    if (str != 0)  {    len = str - inBuf;	memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);  }}/**  * @brief Чтение Cookie пользователя  */static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len){    sprintf(str, "%s", users[user_id].cookie);    *len = strlen(str);}/**  * @brief Установка Cookie пользователя  */static void HTTP_SetUserCookie(char *str, uint8_t user_id){    strcpy(users[user_id].cookie, str);}/**  * @brief Обновление времени последней активности пользователя  */static void HTTP_UpdateUserLoginTime(uint8_t user_id){    xTimerStart(users[user_id].LogoutTimer, 0);}/**  * @brief  Extract the Content_Length data from HTML data  * @param  data : pointer on receive packet buffer  * @param  len  : buffer length  * @retval size : Content_length in numeric format  */static uint32_t Parse_Content_Length(char *data, uint32_t len){  uint32_t i=0,size=0, S=1;  int32_t j=0;  char sizestring[6], *ptr;  ContentLengthOffset =0;  /* find Content-Length data in packet buffer */  for (i=0;i<len;i++)  {    if (strncmp ((char*)(data+i), Content_Length, 16)==0)    {      ContentLengthOffset = i+16;      break;    }  }  /* read Content-Length value */  if (ContentLengthOffset)  {    i=0;    ptr = (char*)(data + ContentLengthOffset);    while(*(ptr+i)!=0x0d)    {      sizestring[i] = *(ptr+i);      i++;      ContentLengthOffset++;    }    if (i>0)    {      /* transform string data into numeric format */      for(j=i-1;j>=0;j--)      {        size += (sizestring[j]-0x30)*S;        S=S*10;      }    }  }  return size;}/**  * @brief Принудительный логаут пользователя  */static void HTTP_ForceUserLogout(uint8_t user_id){    char cookie[MAX_WEB_COOKIE_LEN];    /* Flush user cookie by random value */    sprintf(cookie, "%X", (unsigned int)GetRandomNumber());    HTTP_SetUserCookie(cookie, user_id);}/**  * @brief >Callback таймера логаута пользователя  */void LogoutTimerCallback(TimerHandle_t pxTimer) {    uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );	if( sSettings.sRADIUS.Auth_enable )		HTTP_ForceUserLogout(user_id);}/**  * @brief  Смена пароля пользователя  * @retval None  */int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut){    char tempStr[110];    char value[20];    char login[20];    char password[20];    uint8_t valueLen, valueLen2, user_id;    char WebLogin[MAX_WEB_LOGIN_LEN];    (void)lenBufIn;    memset(login, 0, 20);    memset(password, 0, 20);    memset(tempStr, 0, 50);    memset(value, 0, 20);    ClearParamString(bufIn);    strncpy(tempStr, bufIn, 110);    strcpy(bufOut, HTTP_200_OK);    if (GetParamValue(tempStr, "username=", login, &valueLen) &&        GetParamValue(tempStr, "oldpass=", password, &valueLen))    {          for (user_id = 0; user_id < MAX_WEB_USERS; user_id++)          {        	  memset(value, 0, 20);			  memset(WebLogin, 0, MAX_WEB_LOGIN_LEN);			 GetUserLogin(user_id, WebLogin, &valueLen);			 GetUserPassword(user_id, value, &valueLen2);			 /* Check login and password */			 if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&				 (memcmp(password, value, 11) == 0))			 {				 memset(password, 0, 20);				 if (GetParamValue(tempStr, "newpass=", password, &valueLen))				 {					 memcpy(sSettings.sAuth[user_id].password, password, 11);					 HTTP_SaveSettings();					 log_event_data(LOG_PSW_CHANGE, name_login);					 strcat(bufOut, "Пароль успешно изменён");					 *lenBufOut = strlen(bufOut);					 return SEND_REQUIRED_YES;				 }				 else {					  strcat(bufOut, "Введены некорректные данные!");					  *lenBufOut = strlen(bufOut);					  return SEND_REQUIRED_YES;				 }			 }          }          strcat(bufOut, "Введён неверный пароль!");          *lenBufOut = strlen(bufOut);          return SEND_REQUIRED_YES;  }  else {      strcat(bufOut, "Введены некорректные данные!");      *lenBufOut = strlen(bufOut);      return SEND_REQUIRED_YES;  }}// -----------------------------------------------------------------------------//////  SSL тесты////// -----------------------------------------------------------------------------//#include "stm32f4xx.h"#include "rtc.h"/* PolarSSL includes */#include "polarssl/net.h"#include "polarssl/ssl.h"#include "polarssl/havege.h"#include "polarssl/certs.h"#include "polarssl/x509.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*/#define DEBUG_LEVEL 1  /* Set DEBUG_LEVEL if you want to enable SSL debug                         option, this should be set to 2, 3, 4 or 5 */                         #define HTTP_RESPONSE "<p><p>Successful connection using: %s\r\n"/* Format of dynamic web page */#define PAGE_START \"<html>\<head>\</head>\<BODY onLoad=\"window.setTimeout("location.href='index.html'",1000)\" bgcolor=\"#FFFFFF\" text=\"#000000\">\<font size=\"4\" color=\"#0000FF\"><b>STM32F407xx : SSL Server Demo not using HW Crypto :<)</font></b></i>\<br><br><pre>\r\nPage Hits = "#define PAGE_END \" \r\n</pre><br><br><hr>\<font size=\"3\" color=\"#808080\">All rights reserved ©2017 ROTEK\\r\n</font></BODY>\</html>"/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* SSL structures */rng_state rngs;ssl_context ssl;ssl_session ssn;x509_cert srvcert;rsa_context rsa;uint32_t nPageHits = 0;/* Private functions ---------------------------------------------------------*//* * Computing a "safe" DH-1024 prime can take a very * long time, so a precomputed value is provided below. * You may run dh_genprime to generate a new value. */char *my_dhm_P =   "E4004C1F94182000103D883A448B3F80" \  "2CE4B44A83301270002C20D0321CFD00" \  "11CCEF784C26A400F43DFB901BCA7538" \  "F2C6B176001CF5A0FD16D2C48B1D0C1C" \  "F6AC8E1DA6BCC3B4E1F96B0564965300" \  "FFA1D0B601EB2800F489AA512C4B248C" \  "01F76949A60BB7F00A40B1EAB64BDD48" \  "E8A700D60B7F1200FA8E77B0A979DABF";char *my_dhm_G = "4";/* * Sorted by order of preference */int my_ciphersuites[] ={  SSL_EDH_RSA_AES_256_SHA,  SSL_EDH_RSA_CAMELLIA_256_SHA,  SSL_EDH_RSA_AES_128_SHA,  SSL_EDH_RSA_CAMELLIA_128_SHA,  SSL_EDH_RSA_DES_168_SHA,  SSL_RSA_AES_256_SHA,  SSL_RSA_CAMELLIA_256_SHA,  SSL_RSA_AES_128_SHA,  SSL_RSA_CAMELLIA_128_SHA,  SSL_RSA_DES_168_SHA,  SSL_RSA_RC4_128_SHA,  SSL_RSA_RC4_128_MD5,  0};void my_debug(void *ctx, int level, const char *str){  if(level < DEBUG_LEVEL)  {    printf("\r%s", str);    }}/* * These session callbacks use a simple chained list * to store and retrieve the session information. */ssl_session *s_list_1st = NULL;ssl_session *cur, *prv;static int my_get_session(ssl_context *ssl){  time_t t = RTC_GetUnixTime(); //time(NULL);  if(ssl->resume == 0)    return(1);  cur = s_list_1st;  prv = NULL;  while(cur != NULL)  {    prv = cur;    cur = cur->next;    if(ssl->timeout != 0 && t - prv->start > ssl->timeout)      continue;    if( ssl->session->ciphersuite != prv->ciphersuite ||        ssl->session->length != prv->length)      continue;    if(memcmp( ssl->session->id, prv->id, prv->length ) != 0)      continue;    memcpy(ssl->session->master, prv->master, 48);      return(0);  }  return(1);}static int my_set_session(ssl_context *ssl){  time_t t = RTC_GetUnixTime(); //time(NULL);  cur = s_list_1st;  prv = NULL;  while(cur != NULL)  {    if(ssl->timeout != 0 && t - cur->start > ssl->timeout)      break; /* expired, reuse this slot */    if(memcmp( ssl->session->id, cur->id, cur->length ) == 0)      break; /* client reconnected */    prv = cur;    cur = cur->next;  }  if(cur == NULL)  {    cur = (ssl_session *) malloc(sizeof(ssl_session));    if(cur == NULL)      return(1);    if(prv == NULL)      s_list_1st = cur;    else  prv->next  = cur;  }  memcpy(cur, ssl->session, sizeof(ssl_session));  return(0);}/**  * @brief  SSL Server task.  * @param  pvParameters not used  * @retval None  */void ssl_server(void *pvParameters){    int ret, len;    int listen_fd;    int client_fd;    char buf[1024];        char *ptr;    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;        memset(&srvcert, 0, sizeof(x509_cert));        // 1. Load the certificates and private RSA key     //printf("\n\r Loading the server certificates and key...");          // This demonstration program uses embedded test certificates.    // Instead, you may want to use x509parse_crtfile() to read the    // server and CA certificates, as well as x509parse_keyfile().     ret = x509parse_crt(&srvcert, (unsigned char *) test_srv_crt, strlen(test_srv_crt));    if(ret != 0)    {        //printf(" failed\n  !  x509parse_crt returned %d\n\r", ret);        goto exit;    }    ret = x509parse_crt(&srvcert, (unsigned char *) test_ca_crt, strlen(test_ca_crt));    if(ret != 0)    {        //printf(" failed\n  !  x509parse_crt returned %d\n\r", ret);        goto exit;    }    rsa_init( &rsa, RSA_PKCS_V15, 0 );    ret =  x509parse_key(&rsa, (unsigned char *) test_srv_key, strlen(test_srv_key), NULL, 0);    if( ret != 0 )    {        //printf(" failed\n  !  x509parse_key returned %d\n\r", ret);        goto exit;    }        // 2. Setup the listening TCP socket     //printf("\n\r Bind to https port ...");      // Bind the connection to https port : 443     ret = net_bind(&listen_fd, NULL, 443);     if(ret != 0)    {        //printf(" failed\n  ! net_bind returned %d\n\r", ret);        goto exit;    }    //printf(" ok\n\r");        // 3. Wait until a client connects     for(;;)    {        //printf("\n\r Waiting for a remote connection ...");        ret = net_accept(listen_fd, &client_fd, NULL);        if(ret != 0)        {            //printf(" failed\n  ! net_accept returned %d\n\n", ret);            goto exit;        }        //printf(" ok\n");        // 4. Initialize the session data         //printf("\n\r Setting up the RNG and SSL data....");            // Initialize the SSL context         ret = ssl_init(&ssl);        if(ret != 0)        {            //printf(" failed\n  ! ssl_init returned %d\n\n", ret);            goto accept;        }        //printf(" ok\n");        // Set the current session as SSL server         ssl_set_endpoint(&ssl, SSL_IS_SERVER);        // No certificate verification         ssl_set_authmode(&ssl, SSL_VERIFY_NONE);        // Set the random number generator callback function         ssl_set_rng(&ssl, RandVal, &rngs);         // Set the debug callback function         //ssl_set_dbg(&ssl, my_debug, stdout);        // Set read and write callback functions         ssl_set_bio(&ssl, net_recv, &client_fd, net_send, &client_fd);        // Set the session callback functions         ssl_set_scb(&ssl, my_get_session, my_set_session);        // The list of ciphersuites to be used in this session         ssl_set_ciphersuites(&ssl, my_ciphersuites);        // Set the session resuming flag, timeout and session context         ssl_set_session(&ssl, 1, 0, &ssn);        memset(&ssn, 0, sizeof(ssl_session));        // Set the data required to verify peer certificate         ssl_set_ca_chain(&ssl, srvcert.next, NULL, NULL);        // Set own certificate and private key         ssl_set_own_cert(&ssl, &srvcert, &rsa);        // Set the Diffie-Hellman public P and G values         ssl_set_dh_param(&ssl, my_dhm_P, my_dhm_G);        // 5. Handshake protocol         //printf("\n\r Performing the SSL/TLS handshake...");        // Perform the SSL handshake protocol         while((ret = ssl_handshake(&ssl)) != 0)        {            if(ret != POLARSSL_ERR_NET_WANT_READ && ret != POLARSSL_ERR_NET_WANT_WRITE)            {                //printf(" failed\n  ! ssl_handshake returned %d\n\n", ret);                goto accept;            }        }        //printf(" ok\n");        // 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);    // -------------------------------------------------------------------------                //receivedBufLen = p->tot_len;        //memcpy(receiveBuf, p->payload , receivedBufLen);        receiveBuf[receivedBufLen] = '\0';        // printf("receive %s \r\n", receiveBuf);        // Get cookie "uname" value         CookiePtr = strstr(receiveBuf, "uname=");        strncpy(CookieBuf, CookiePtr, 50);        //printf("********CookieBuf1= %s\r\n", CookieBuf);        memset(name, 0, MAX_WEB_COOKIE_LEN);        GetCookieValue(CookieBuf, "uname=", name, &nameLen);        //printf("********CookieBuf2= %s\r\n", CookieBuf);        //printf("********uname= %s\r\n", name);        // Get cookie "id" value         CookiePtr = strstr(receiveBuf, "id=");        strncpy(CookieBuf, CookiePtr, 50);        //printf("********CookieBuf1= %s\r\n", CookieBuf);        memset(id, 0, MAX_WEB_COOKIE_LEN);        GetCookieValue(CookieBuf, "id=", id, &idLen);        //printf("********CookieBuf2= %s\r\n", CookieBuf);        //printf("********id= %s\r\n", id);        // 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++) {            HTTP_GetUserCookie(user_id, CookieBuf, &idLen);            if (strncmp(id, CookieBuf, idLen) == 0 ) {                GetUserLevelInt(user_id, &seclevel);                Authenticated = true;                break;            }            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);            ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);        }        else if ( Authenticated == false )//&& sSettings.sRADIUS.Auth_enable == true        {            if (strncmp(receiveBuf, "GET /main.css", 13) == 0) // +            {                fs_open("/main.css", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /rotek.png", 14) == 0) // +            {                fs_open("/rotek.png", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /favicon.ico", 16) == 0) // ?            {                fs_open("/favicon.ico", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /role.js", 12) == 0)            {                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))            {                uint32_t i, offset = 0, req_data_received = 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;										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;                        }                        else                         {                            strncat(post_req_data, (char *)(receiveBuf + offset), post_data_count);						                            if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES)                             {                                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                            }                            else                             {                            	/*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;                        }					}					/* 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;						}					}                }                else                 {                    //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))						fs_open("/rslogin.html", &file);					else						fs_open("/login.html", &file);                    ssl_sendframes(&ssl, file.data, file.len);                }            }			else if (post_data_count > 0)			{                strncat(post_req_data, receiveBuf, post_data_count);                if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), &sendBufLoadLen) == SEND_REQUIRED_YES)                 {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                }				else                 {					/*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            {            	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);			}        }        else if ( Authenticated == true )         {            if (strncmp(receiveBuf, "GET /main.css", 13) == 0) // +            {                fs_open("/main.css", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /rotek.png", 14) == 0) // +            {                fs_open("/rotek.png", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /favicon.ico", 16) == 0) // ?                             {                                                                                     fs_open("/favicon.ico", &file);                                                     ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /main.js", 12) == 0) // +            {                fs_open("/main.js", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /role.js", 12) == 0)            {                fs_open("/role.js", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /settings.html", 18) == 0) // +            {                HTTP_UpdateUserLoginTime(user_id);                if (seclevel == 0)                {                    fs_open("/settings.html", &file);                    ssl_sendframes(&ssl, file.data, file.len);                }                else                 {                    fs_open("/index.html", &file);                    ssl_sendframes(&ssl, file.data, file.len);				}            }            else if (strncmp(receiveBuf, "GET /info.html", 14) == 0) // +            {                HTTP_UpdateUserLoginTime(user_id);                fs_open("/info.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /history.html", 17) == 0)            {                HTTP_UpdateUserLoginTime(user_id);                fs_open("/history.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /ups_history.html", 21) == 0)            {                HTTP_UpdateUserLoginTime(user_id);                fs_open("/ups_history.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            else if (strncmp(receiveBuf, "GET /getJson.cgi", 16) == 0) // +            {                HTTP_GetParamsPage1(sendBuf);                ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));            }	              else if (strncmp(receiveBuf, "GET /settings.cgi", 17) == 0) // +            {                if (seclevel == 0) {                    SET_PAGE = SET_PAGE_PAGE2;                    if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)                    {                        ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                    }                }            }            else if (strncmp(receiveBuf, "POST /settings.cgi", 18) == 0)            {                if (seclevel == 0)                 {                    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);                        // 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;                    }                    ptr = (char*)(receiveBuf + 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);                        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) // +            {                if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)                {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                }            }            else if (strncmp(receiveBuf, "POST /info.cgi", 14) == 0)            {                if (seclevel == 0)                 {                    DataOffset = 0;                    // 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(receiveBuf, receivedBufLen);                        // 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;                    // 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);                        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 /history.cgi", 16) == 0)            {                int res;                res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                if (res == SEND_REQUIRED_FILE)                {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                                        //send_data(pcb, hs);                    //tcp_sent(pcb, http_sent_history);                    HTTP_SendHistory();                    //tcp_err(pcb, http_sent_log_err);                }                else if (res == SEND_REQUIRED_YES)                 {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                }            }            else if (strncmp(receiveBuf, "GET /ups_history.cgi", 19) == 0)            {                int res;                res = HTTP_UpsHistoryPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                if (res == SEND_REQUIRED_FILE)                {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                                        //send_data(pcb, hs);                    //tcp_sent(pcb, http_sent_log);                    HTTP_SendLog();                    //tcp_err(pcb, http_sent_log_err);                }                else if (res == SEND_REQUIRED_YES)                 {                    ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);                }            }            /* Тест  АКБ ИБП */            else if (strncmp(receiveBuf, "GET /bat_test.cgi", 17) == 0)            {                HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);            }            /* Выключение ИБП */            else if (strncmp(receiveBuf, "GET /ups_power.cgi", 18) == 0)            {                HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);            }            /* Сброс настроек и сохранине */            else if (strncmp(receiveBuf, "GET /reset.cgi", 14) == 0)            {                HTTP_ResetSettings();                HTTP_SaveSettings();                fs_open("/settings.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            /* Перезагрузка контроллера */            else if (strncmp(receiveBuf, "GET /reboot.cgi", 15) == 0)            {                HTTP_Reboot();            }            /* Подтверждение новых сетевых настроек */            else if (strncmp(receiveBuf, "GET /confirm.cgi", 16) == 0)            {                SetWebReinitFlag(false);                SetConfirmWebParamsFlag();                fs_open("/index.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }            /* Проверка пароля, переход в bootloader */            else if (strncmp(receiveBuf, "GET /fw_update.cgi", 18) == 0)            {                HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);            }            /* Смена пароля пользователя */            else if (strncmp(receiveBuf, "GET /changepwd.cgi", 18) == 0)            {                HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);            }            // На производстве            else if (strncmp(receiveBuf, "GET /setProdate.cgi", 19) == 0)            {                HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);                ssl_sendframes(&ssl, sendBuf, sendBufLoadLen);            }            else            {                HTTP_UpdateUserLoginTime(user_id);                fs_open("/index.html", &file); // +                ssl_sendframes(&ssl, file.data, file.len);            }        }    //}                                                /*        if (strncmp(buf, "GET /main.css", 13) == 0) // +        {            fs_open("/main.css", &file);            ssl_sendframes(&ssl, file.data, file.len);        }                else if (strncmp(buf, "GET /rotek.png", 14) == 0) // +        {            fs_open("/rotek.png", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        else if (strncmp(buf, "GET /favicon.ico", 16) == 0) // ?                         {                                                                                 fs_open("/favicon.ico", &file);                                                 ssl_sendframes(&ssl, file.data, file.len);                                                  }        else if (strncmp(buf, "GET /main.js", 12) == 0) // +        {            fs_open("/main.js", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        else if (strncmp(buf, "GET /getJson.cgi", 16) == 0) // +        {            HTTP_GetParamsPage1(sendBuf);            ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));        }	        else if (strncmp(buf, "GET /settings.html", 18) == 0) // +        {            fs_open("/settings.html", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        else if (strncmp(buf, "GET /info.html", 14) == 0) // +        {            fs_open("/info.html", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        else if (strncmp(buf, "GET /getJson.cgi", 16) == 0) // +        {            HTTP_GetParamsPage1(sendBuf);            ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));        }	          else if (strncmp(buf, "GET /settings.cgi", 17) == 0) // +        {            SET_PAGE = SET_PAGE_PAGE2;		            if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)            {                ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));            }            else            {                fs_open("/settings.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }        }        else if (strncmp(buf, "GET /info.cgi", 13) == 0) // +        {            if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen) == SEND_REQUIRED_YES)            {                ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));            }            else            {                fs_open("/info.html", &file);                ssl_sendframes(&ssl, file.data, file.len);            }        }        // Сброс настроек и сохранине         else if (strncmp(buf, "GET /reset.cgi", 14) == 0)        {            HTTP_ResetSettings();            HTTP_SaveSettings();		            fs_open("/settings.html", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        // Перезагрузка контроллера         else if (strncmp(buf, "GET /reboot.cgi", 15) == 0)        {            HTTP_Reboot();        }	        // Подтверждение новых сетевых настроек         else if (strncmp(buf, "GET /confirm.cgi", 16) == 0)        {            SetWebReinitFlag(false);            SetConfirmWebParamsFlag();		            fs_open("/index.html", &file);            ssl_sendframes(&ssl, file.data, file.len);        }        // Проверка пароля, переход в bootloader         else if (strncmp(buf, "POST /checkpwd.cgi", 18) == 0)        {            HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);            ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));        }	        // На производстве        else if (strncmp(buf, "GET /setProdate.cgi", 19) == 0)        {            HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);            ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));        }        // На производстве        else if (strncmp(buf, "GET /progon.cgi", 15) == 0)        {            HTTP_Progon(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);            ssl_sendframes(&ssl, sendBuf, strlen(sendBuf));        }        else        {            fs_open("/index.html", &file);             ssl_sendframes(&ssl, file.data, file.len);        }    // -------------------------------------------------------------------------    */        // Для теста        // 7. Write the Response     //printf("\n\r => Write to client :\n\r");    // Send the dynamic html page     //ssl_DynPage(&ssl);            // Close the connection     ssl_close_notify(&ssl);    goto accept;exit:    // Close and delete the current session data: certificate, RSA key and SSL session     x509_free(&srvcert);    rsa_free(&rsa);    cur = s_list_1st;    while(cur != NULL)    {      prv = cur;      cur = cur->next;      memset(prv, 0, sizeof(ssl_session));      free(prv);    }    memset(&ssl, 0, sizeof(ssl_context));accept:    // Wait 200s until next retry     vTaskDelay(200);     // Close and free the SSL context     net_close(client_fd);    ssl_free(&ssl);  }}           /**  * @brief  Create and send a dynamic Web Page.  This page contains the list of   *         running tasks and the number of page hits.   * @param  ssl the SSL context  * @retval None  */void ssl_DynPage(ssl_context *ssl){  portCHAR buf[2024];  portCHAR pagehits[10];  portCHAR getcipher[100];  uint32_t len = 0;  memset(buf, 0, 2024);  // Update the hit count   nPageHits++;  sprintf( pagehits, "%d", nPageHits );  sprintf( (char *) getcipher, HTTP_RESPONSE, ssl_get_ciphersuite(ssl));       // Generate the dynamic page   strcpy(buf, PAGE_START);  // Page header   strcat(buf, pagehits);  strcat((char *) buf, "<br><pre>** The list of tasks and their status **");  strcat((char *) buf, "<br><pre>---------------------------------------------");   strcat((char *) buf, "<br>Name          State  Priority  Stack   Num" );  //strcat((char *) buf, "<br>---------------------------------------------");   strcat((char *) buf, "<br>---------------------------------------------<br>");       // The list of tasks and their status   vTaskList((signed char *)buf + strlen(buf));  strcat((char *) buf, "<br>---------------------------------------------");   strcat((char *) buf, "<br>B : Blocked, R : Ready, D : Deleted, S : Suspended");  // The current cipher used   strcat(buf, getcipher);  // Page footer   strcat(buf, PAGE_END);    // Send the dynamically generated page   len = ssl_write(ssl, (unsigned char *)buf, strlen(buf));  // Display the length of application data   //printf( "\n Successfully write %d bytes to client\n\r", len);}/**  * @brief  This function is used to send messages with size upper 16k bytes.  * @param  ssl  SSL context  * @param  data buffer holding the data  * @param  len  how many bytes must be written  * @retval None  */#define FRAME_SIZE   (1000)void ssl_sendframes( ssl_context *ssl, char *data, int datalen ){  int index = 0;  int k = 0;  int lastframe, nbrframes;  // Calculate the number of frames   nbrframes = datalen / FRAME_SIZE;     // Send nbrframes frames   while(nbrframes > 0)  {    index = k * FRAME_SIZE;    ssl_write( ssl, (unsigned char *)(data + index), FRAME_SIZE );    nbrframes--;    k++;  }  // Send the last frame   index = k * FRAME_SIZE;  lastframe = datalen % FRAME_SIZE ;  ssl_write( ssl, (unsigned char *)(data + index), lastframe );}/**  * @brief  Returns a 32-bit random number.  * @param  arg not used  * @retval 32-bit random number  */int RandVal(void* arg){  return (int)GetRandomNumber();}/**  * @brief Send callback for log file transfer (messages as is, not ordered)  */void HTTP_SendHistory(void){    uint32_t nbytes = 0;    static bool start = true;    memset(logFileBuf, 0, FILE_BUF_MAX_LEN);        if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {        nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);    }    else if (log_ptr < log_size) {        nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);    }    else {        nbytes = 0;    }    log_ptr += nbytes;    start = false;        if (nbytes == 0) {        // File transfer finished.         start = true;        // Clear file transfer in progress flag         fLogTransInprog = false;        return;    }    ssl_sendframes(&ssl, logFileBuf, nbytes);    HTTP_SendHistory();}/**  * @brief Sent callback for log file transfer (messages as is, not ordered)  */void HTTP_SendLog(void){    uint32_t nbytes = 0;    static bool start = true;	memset(logFileBuf, 0, FILE_BUF_MAX_LEN);    if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {        nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);    }    else if (log_ptr < log_size) {        nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);    }    else {        nbytes = 0;    }    log_ptr += nbytes;    start = false;    if (nbytes == 0) {        // File transfer finished.         start = true;        // Clear file transfer in progress flag         fLogTransInprog = false;        return;    }    ssl_sendframes(&ssl, logFileBuf, nbytes);    HTTP_SendLog();      return;}/**  * @brief  Initialize the HTTPS server (start its thread)   */void HTTPS_Init(){	char buf[MAX_WEB_COOKIE_LEN];	uint8_t user_id;        for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {        // Flush user cookie by random value         sprintf(buf, "%X", (unsigned int)GetRandomNumber());        HTTP_SetUserCookie(buf, user_id);        // Create user logout timers         users[user_id].LogoutTimer =             xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);    }}
 |