my_ssl_server.c 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661
  1. /*
  2. * ssl_server.c
  3. *
  4. * Created on: 08.11.2017
  5. * Author: balbekova
  6. */
  7. #ifdef HARDWARE_BT6702
  8. #include "lwip/opt.h"
  9. #include "lwip/arch.h"
  10. #include "lwip/api.h"
  11. #include "lwip/tcp.h"
  12. #include "my_ssl_server.h"
  13. #include "web_params_api.h"
  14. #include "parameters.h"
  15. #include "urlcode.h"
  16. #include "trap_params.h"
  17. #include "fsdata.c"
  18. #include "settings_api.h"
  19. #include "netconf.h"
  20. #include "common_config.h"
  21. #include "testing.h"
  22. #include "rtc.h"
  23. #include "rng.h"
  24. #include "megatec.h"
  25. #include "log.h"
  26. #include "hal.h"
  27. #include "radius_user.h"
  28. #include "sntp_api.h"
  29. #ifdef PRINTF_STDLIB
  30. #include <stdio.h>
  31. #endif
  32. #ifdef PRINTF_CUSTOM
  33. #include "tinystdio.h"
  34. #endif
  35. #include <string.h>
  36. #include <stdlib.h>
  37. #include "FreeRTOS.h"
  38. #include "task.h"
  39. #include "fr_timers.h"
  40. static int fs_open(char *name, struct fs_file *file);
  41. static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len);
  42. static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len);
  43. static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len);
  44. static void http_sent_log_err(void * arg, err_t err);
  45. static void send_data(struct tcp_pcb *pcb, struct http_state *hs);
  46. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len);
  47. static uint32_t Parse_Content_Length(char *data, uint32_t len);
  48. static void HTTP_SetUserCookie(char *str, uint8_t user_id);
  49. static void HTTP_UpdateUserLoginTime(uint8_t user_id);
  50. static void HTTP_ForceUserLogout(uint8_t user_id);
  51. void LogoutTimerCallback(TimerHandle_t pxTimer);
  52. void LoginTimerCallback(TimerHandle_t pxTimer);
  53. int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut);
  54. char* send_file(char *filename, char *pnonmatch, struct fs_file *file, uint16_t *Len);
  55. static uint32_t Parse_Header(char *data, uint32_t len, const char *field, uint32_t flen, char *value);
  56. bool GetFileName(char *inStr, char *fileName, uint8_t *fileNameLen);
  57. SET_PAGE_t SET_PAGE = SET_PAGE_IDLE;
  58. #define SEND_BUF_MAX_LEN 2000
  59. #define RECIVE_BUF_MAX_LEN 1500
  60. char sendBuf[SEND_BUF_MAX_LEN];
  61. uint16_t sendBufLoadLen = 0;
  62. uint16_t printLen = 0;
  63. char receiveBuf[RECIVE_BUF_MAX_LEN];
  64. uint16_t receivedBufLen = 0;
  65. #define MAX_POST_REQ_LEN 256
  66. char post_req_data[MAX_POST_REQ_LEN];
  67. uint32_t post_data_count = 0;
  68. uint32_t log_post_reqn;
  69. /* Logout timeout, 30 minutes */
  70. #define WEB_LOGOUT_TIME configTICK_RATE_HZ*60*30
  71. /* Max user active sessions count */
  72. #define WEB_USER_MAX_SESSION_COUNT 5
  73. struct {
  74. //auth_session_t session[WEB_USER_MAX_SESSION_COUNT];
  75. char cookie[MAX_WEB_COOKIE_LEN];
  76. TimerHandle_t LogoutTimer;
  77. } users[MAX_WEB_USERS];
  78. TimerHandle_t RepeatLoginTimer;
  79. /* Repeat Login timeout, 1 minutes */
  80. #define REPEAT_LOGIN_TIME configTICK_RATE_HZ*60*1
  81. uint8_t cnt_err_psw = 0;
  82. bool Authenticated = false;
  83. /* Level of currently logged-in user */
  84. uint8_t seclevel = 0xFF;
  85. /* Max HTTP file name length including "/" */
  86. #define MAX_FILENAME_LEN 32
  87. /* Max HTTP Etag field length */
  88. #define MAX_ETAG_LEN 48
  89. static const char If_None_Match[] = "If-None-Match: ";
  90. static const char Etag[] = "ETag: ";
  91. static volatile uint32_t DataFlag2=0;
  92. static volatile uint32_t DataFlag=0;
  93. static volatile uint32_t size =0;
  94. static uint32_t TotalReceived=0;
  95. static volatile uint32_t TotalData=0;
  96. static uint32_t ContentLengthOffset =0, BrowserFlag=0;
  97. static const char Content_Length[17] =
  98. /* Content Length */
  99. {0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67,0x74, 0x68, 0x3a, 0x20, };
  100. const char HTTP_304_NOT_MODIFIED[] = "HTTP/1.1 304 Not Modified\r\n\r\n";
  101. const char HTTP_200_OK[] = "HTTP/1.1 200 OK\r\n\r\n";
  102. /* utf-8 marker to support MS Excel */
  103. const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF, 0x00};
  104. unsigned long log_ptr = 0;
  105. unsigned long log_size = 0;
  106. bool fLogTransInprog = false;
  107. static bool fl_raddius_net_err = false;
  108. /**
  109. * @brief Общая структура настроек
  110. */
  111. extern SETTINGS_t sSettings;
  112. /**
  113. * @brief closes tcp connection
  114. * @param pcb: pointer to a tcp_pcb struct
  115. * @param hs: pointer to a http_state struct
  116. * @retval
  117. */
  118. static void close_conn(struct tcp_pcb *pcb, struct http_state *hs)
  119. {
  120. tcp_arg(pcb, NULL);
  121. tcp_sent(pcb, NULL);
  122. tcp_recv(pcb, NULL);
  123. mem_free(hs);
  124. tcp_close(pcb);
  125. }
  126. /**
  127. * @brief callback function for handling TCP HTTP traffic
  128. * @param arg: pointer to an argument structure to be passed to callback function
  129. * @param pcb: pointer to a tcp_pcb structure
  130. * @param p: pointer to a packet buffer
  131. * @param err: LwIP error code
  132. * @retval err
  133. */
  134. static err_t http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
  135. {
  136. char *data;
  137. struct http_state *hs;
  138. struct fs_file file = {0, 0};
  139. char buf[150];
  140. hs = arg;
  141. if (err == ERR_OK && p != NULL)
  142. {
  143. tcp_recved(pcb, p->tot_len);
  144. if (hs->file == NULL)
  145. {
  146. data = p->payload;
  147. receivedBufLen = p->tot_len;
  148. memcpy(receiveBuf, p->payload , receivedBufLen);
  149. // На производстве
  150. if (strncmp(data, "GET /setProdate.cgi", 19) == 0 && strncmp(sSettings.sFlags.testState, "T2OK", 4) == 0)
  151. {
  152. HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, &sendBufLoadLen);
  153. hs->file = sendBuf;
  154. hs->left = sendBufLoadLen;
  155. send_data(pcb, hs);
  156. tcp_sent(pcb, http_sent);
  157. }
  158. else {
  159. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
  160. strcat(sendBuf, "\r\n\r\n");
  161. memset(buf, 0, 100);
  162. // strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=https://192.168.14.35\"/></head></html>\r\n\r\n");
  163. if (sSettings.sFlags.netsettingsChanged == true)
  164. sprintf(buf, "<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=https://%s\"/></head></html>\r\n\r\n", sSettings.sWebTempParams.ip);
  165. else
  166. sprintf(buf, "<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=https://%s\"/></head></html>\r\n\r\n", sSettings.sWebParams.ip);
  167. strcat(sendBuf,buf);
  168. // strcat(sendBuf,"1");
  169. sendBufLoadLen = strlen(sendBuf);
  170. hs->file = sendBuf;
  171. hs->left = sendBufLoadLen;
  172. send_data(pcb, hs);
  173. tcp_sent(pcb, http_sent);
  174. }
  175. }
  176. pbuf_free(p);
  177. close_conn(pcb,hs);
  178. }
  179. if (err == ERR_OK && p == NULL)
  180. {
  181. close_conn(pcb, hs);
  182. }
  183. return ERR_OK;
  184. }
  185. /**
  186. * @brief Error callback for log file transfer
  187. */
  188. static void http_sent_log_err(void * arg, err_t err)
  189. {
  190. (void)err;
  191. (void)arg;
  192. /* Clear file transfer in progress flag */
  193. fLogTransInprog = false;
  194. }
  195. /**
  196. * @brief Sent callback for log file transfer (messages as is, not ordered)
  197. */
  198. static err_t http_sent_log(void *arg, struct tcp_pcb *pcb, u16_t len)
  199. {
  200. struct http_state *hs;
  201. uint32_t nbytes = 0;
  202. static bool start = true;
  203. (void)len;
  204. hs = arg;
  205. if (hs->left > 0)
  206. {
  207. send_data(pcb, hs);
  208. }
  209. else
  210. {
  211. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  212. if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {
  213. nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);
  214. }
  215. else if (log_ptr < log_size) {
  216. nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  217. }
  218. else {
  219. nbytes = 0;
  220. }
  221. log_ptr += nbytes;
  222. start = false;
  223. if (nbytes == 0) {
  224. /* File transfer finished. */
  225. start = true;
  226. close_conn(pcb, hs);
  227. /* Clear file transfer in progress flag */
  228. fLogTransInprog = false;
  229. return ERR_OK;
  230. }
  231. hs->file = logFileBuf;
  232. hs->left = nbytes;
  233. send_data(pcb, hs);
  234. tcp_sent(pcb, http_sent_log);
  235. }
  236. return ERR_OK;
  237. }
  238. /**
  239. * @brief Sent callback for log file transfer (messages as is, not ordered)
  240. */
  241. static err_t http_sent_history(void *arg, struct tcp_pcb *pcb, u16_t len)
  242. {
  243. struct http_state *hs;
  244. uint32_t nbytes = 0;
  245. static bool start = true;
  246. (void)len;
  247. hs = arg;
  248. if (hs->left > 0)
  249. {
  250. send_data(pcb, hs);
  251. }
  252. else
  253. {
  254. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  255. if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {
  256. nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);
  257. }
  258. else if (log_ptr < log_size) {
  259. nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  260. }
  261. else {
  262. nbytes = 0;
  263. }
  264. log_ptr += nbytes;
  265. start = false;
  266. if (nbytes == 0) {
  267. /* File transfer finished. */
  268. start = true;
  269. close_conn(pcb, hs);
  270. /* Clear file transfer in progress flag */
  271. fLogTransInprog = false;
  272. return ERR_OK;
  273. }
  274. hs->file = logFileBuf;
  275. hs->left = nbytes;
  276. send_data(pcb, hs);
  277. tcp_sent(pcb, http_sent_history);
  278. }
  279. return ERR_OK;
  280. }
  281. /**
  282. * @brief callback function for handling connection errors
  283. * @param arg: pointer to an argument to be passed to callback function
  284. * @param err: LwIP error code
  285. * @retval none
  286. */
  287. static void conn_err(void *arg, err_t err)
  288. {
  289. struct http_state *hs;
  290. hs = arg;
  291. mem_free(hs);
  292. }
  293. /**
  294. * @brief callback function called after a successfull TCP data packet transmission
  295. * @param arg: pointer to an argument to be passed to callback function
  296. * @param pcb: pointer on tcp_pcb structure
  297. * @param len
  298. * @retval err : LwIP error code
  299. */
  300. static err_t http_sent(void *arg, struct tcp_pcb *pcb, u16_t len)
  301. {
  302. struct http_state *hs;
  303. hs = arg;
  304. if (hs->left > 0)
  305. {
  306. send_data(pcb, hs);
  307. }
  308. else
  309. {
  310. close_conn(pcb, hs);
  311. }
  312. return ERR_OK;
  313. }
  314. /**
  315. * @brief sends data found in member "file" of a http_state struct
  316. * @param pcb: pointer to a tcp_pcb struct
  317. * @param hs: pointer to a http_state struct
  318. * @retval none
  319. */
  320. static void send_data(struct tcp_pcb *pcb, struct http_state *hs)
  321. {
  322. err_t err;
  323. u16_t len;
  324. /* We cannot send more data than space available in the send
  325. buffer */
  326. if (tcp_sndbuf(pcb) < hs->left)
  327. {
  328. len = tcp_sndbuf(pcb);
  329. }
  330. else
  331. {
  332. len = hs->left;
  333. }
  334. err = tcp_write(pcb, hs->file, len, 0);
  335. if (err == ERR_OK)
  336. {
  337. hs->file += len;
  338. hs->left -= len;
  339. }
  340. }
  341. /**
  342. * @brief tcp poll callback function
  343. * @param arg: pointer to an argument to be passed to callback function
  344. * @param pcb: pointer on tcp_pcb structure
  345. * @retval err_t
  346. */
  347. static err_t http_poll(void *arg, struct tcp_pcb *pcb)
  348. {
  349. if (arg == NULL)
  350. {
  351. tcp_close(pcb);
  352. }
  353. else
  354. {
  355. send_data(pcb, (struct http_state *)arg);
  356. }
  357. return ERR_OK;
  358. }
  359. /**
  360. * @brief callback function on TCP connection setup ( on port 80)
  361. * @param arg: pointer to an argument structure to be passed to callback function
  362. * @param pcb: pointer to a tcp_pcb structure
  363. * &param err: Lwip stack error code
  364. * @retval err
  365. */
  366. static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
  367. {
  368. struct http_state *hs;
  369. /* Allocate memory for the structure that holds the state of the connection */
  370. hs = mem_malloc(sizeof(struct http_state));
  371. if (hs == NULL)
  372. {
  373. return ERR_MEM;
  374. }
  375. /* Initialize the structure. */
  376. hs->file = NULL;
  377. hs->left = 0;
  378. /* Tell TCP that this is the structure we wish to be passed for our
  379. callbacks. */
  380. tcp_arg(pcb, hs);
  381. /* Tell TCP that we wish to be informed of incoming data by a call
  382. to the http_recv() function. */
  383. tcp_recv(pcb, http_recv);
  384. tcp_err(pcb, conn_err);
  385. tcp_poll(pcb, http_poll, 10);
  386. return ERR_OK;
  387. }
  388. /**
  389. * @brief Opens a file defined in fsdata.c ROM filesystem
  390. * @param name : pointer to a file name
  391. * @param file : pointer to a fs_file structure
  392. * @retval 1 if success, 0 if fail
  393. */
  394. static int fs_open(char *name, struct fs_file *file)
  395. {
  396. struct fsdata_file_noconst *f;
  397. for (f = (struct fsdata_file_noconst *)FS_ROOT; f != NULL; f = (struct fsdata_file_noconst *)f->next)
  398. {
  399. if (!strcmp(name, f->name))
  400. {
  401. file->data = f->data;
  402. file->len = f->len;
  403. return 1;
  404. }
  405. }
  406. return 0;
  407. }
  408. /**
  409. * @brief Initialize the HTTP server (start its thread)
  410. * @param none
  411. * @retval None
  412. */
  413. void HTTP_Init()
  414. {
  415. struct tcp_pcb *pcb;
  416. pcb = tcp_new();
  417. tcp_bind(pcb, IP_ADDR_ANY, 80);
  418. pcb = tcp_listen(pcb);
  419. tcp_accept(pcb, http_accept);
  420. }
  421. /**
  422. * @brief
  423. * @retval None
  424. */
  425. int HTTP_SettingsPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  426. {
  427. char tempStr[30];
  428. strncpy(tempStr, bufIn, 30);
  429. /* В запросе нет параметров, нужно формировать JSON ответ */
  430. if (strpbrk(tempStr,"?") == 0)
  431. {
  432. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  433. HTTP_GetSettings(bufOut);
  434. *lenBufOut = strlen(bufOut);
  435. return SEND_REQUIRED_YES;
  436. }
  437. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  438. else
  439. {
  440. //HTTP_SetSettings(bufIn, lenBufIn);
  441. return SEND_REQUIRED_NO;
  442. }
  443. }
  444. /**
  445. * @brief
  446. * @retval None
  447. */
  448. int HTTP_InfoPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  449. {
  450. char tempStr[30];
  451. strncpy(tempStr, bufIn, 30);
  452. /* В запросе нет параметров, нужно формировать JSON ответ */
  453. if (strpbrk(tempStr,"?") == 0)
  454. {
  455. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  456. HTTP_GetInfo(bufOut);
  457. *lenBufOut = strlen(bufOut);
  458. return SEND_REQUIRED_YES;
  459. }
  460. /* В запросе есть параметры, нужно парсить и сохранять настройки */
  461. else
  462. {
  463. //HTTP_SetInfo(bufIn, lenBufIn);
  464. return SEND_REQUIRED_NO;
  465. /*
  466. HTTP_SetSettings(bufIn, lenBufIn);
  467. return SEND_REQUIRED_NO;
  468. */
  469. }
  470. }
  471. int HTTP_HistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  472. {
  473. uint8_t i, valueLen = 0;
  474. char value[20];
  475. uint32_t nbytes = 0;
  476. (void)lenBufIn;
  477. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  478. ClearParamString(bufIn);
  479. memset(value, 0, 20);
  480. GetParamValue(bufIn, "page=", value, &valueLen);
  481. if (strcmp(value, "all") == 0)
  482. {
  483. if (!LOG_IsInit()) {
  484. return SEND_REQUIRED_NO;
  485. }
  486. if (fLogTransInprog == false) {
  487. // Send log as raw data
  488. log_ptr = 0;
  489. log_size = History_GetTotalSTRCount() * STRING_SIZE_HISTORY + sizeof(UTF8_BOM)-1;
  490. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  491. *lenBufOut = strlen(bufOut);
  492. // Set file transfer in progress flag
  493. fLogTransInprog = true;
  494. return SEND_REQUIRED_FILE;
  495. }
  496. else {
  497. // We send nothing if file transfer already in progress
  498. return SEND_REQUIRED_NO;
  499. }
  500. }
  501. else {
  502. if (!LOG_IsInit()) {
  503. return SEND_REQUIRED_NO;
  504. }
  505. else {
  506. HTTP_GetHistoryPage(bufOut, atoi(value));
  507. *lenBufOut = strlen(bufOut);
  508. return SEND_REQUIRED_YES;
  509. }
  510. }
  511. }
  512. int HTTP_UpsHistoryPage(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  513. {
  514. uint8_t i, valueLen = 0;
  515. char value[20];
  516. uint32_t nbytes = 0;
  517. (void)lenBufIn;
  518. memset(bufOut, 0, FILE_BUF_MAX_LEN);
  519. ClearParamString(bufIn);
  520. memset(value, 0, 20);
  521. GetParamValue(bufIn, "page=", value, &valueLen);
  522. if (strcmp(value, "all") == 0)
  523. {
  524. if (!LOG_IsInit()) {
  525. return SEND_REQUIRED_NO;
  526. }
  527. if (fLogTransInprog == false) {
  528. // Send log as raw data
  529. log_ptr = 0;
  530. log_size = LOG_GetTotalSTRCount() * STRING_SIZE + sizeof(UTF8_BOM)-1;
  531. sprintf(bufOut, "HTTP/1.1 200 OK\r\nContent-Length:%lu\r\n\r\n%s", log_size, UTF8_BOM);
  532. *lenBufOut = strlen(bufOut);
  533. // Set file transfer in progress flag
  534. fLogTransInprog = true;
  535. return SEND_REQUIRED_FILE;
  536. }
  537. else {
  538. // We send nothing if file transfer already in progress
  539. return SEND_REQUIRED_NO;
  540. }
  541. }
  542. else {
  543. if (!LOG_IsInit()) {
  544. return SEND_REQUIRED_NO;
  545. }
  546. else {
  547. HTTP_GetUpsHistoryPage(bufOut, atoi(value));
  548. *lenBufOut = strlen(bufOut);
  549. return SEND_REQUIRED_YES;
  550. }
  551. }
  552. }
  553. /**
  554. * @brief Установка даты производства
  555. */
  556. // TODO Убрать заглушку!
  557. void HTTP_Prodate(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  558. {
  559. uint8_t valueLen = 0;
  560. char value[20];
  561. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  562. ClearParamString(bufIn);
  563. memset(value, 0, 20);
  564. GetParamValue(bufIn, "prodate=", value, &valueLen);
  565. /*
  566. printf("Prodate: ");
  567. printf(value);
  568. printf("\r\n");
  569. */
  570. /* Устанавливаем дату производства */
  571. SETTINGS_SetProDate(value, valueLen);
  572. /* Пока отправляем true */
  573. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\nTrue");
  574. *lenBufOut = strlen(bufOut);
  575. TEST_SetServerFlag();
  576. }
  577. /**
  578. * @brief
  579. * @retval None
  580. */
  581. void HTTP_SetSettings(char *buf, uint16_t lenBuf)
  582. {
  583. uint8_t valueLen = 0;
  584. const uint8_t len = MAX_WEB_PARAM_LEN;
  585. char value[MAX_WEB_PARAM_LEN];
  586. char str[MAX_WEB_PARAM_LEN];
  587. //printf(buf);
  588. //ClearParamString(buf);
  589. memset(value, 0, len);
  590. memset(str, 0, MAX_WEB_PARAM_LEN);
  591. /* SNMP */
  592. GetParamValue(buf, "read_community=", value, &valueLen);
  593. SetReadCommunity(value);
  594. memset(value, 0, len);
  595. GetParamValue(buf, "write_community=", value, &valueLen);
  596. SetWriteCommunity(value);
  597. memset(value, 0, len);
  598. GetParamValue(buf, "managerIP=", value, &valueLen);
  599. SetManagerIp(value);
  600. memset(value, 0, len);
  601. GetParamValue(buf, "managerIP2=", value, &valueLen);
  602. SetManagerIp2(value);
  603. memset(value, 0, len);
  604. GetParamValue(buf, "managerIP3=", value, &valueLen);
  605. SetManagerIp3(value);
  606. memset(value, 0, len);
  607. GetParamValue(buf, "managerIP4=", value, &valueLen);
  608. SetManagerIp4(value);
  609. memset(value, 0, len);
  610. GetParamValue(buf, "managerIP5=", value, &valueLen);
  611. SetManagerIp5(value);
  612. memset(value, 0, len);
  613. /* Сетевые параметры */
  614. GetParamValue(buf, "dhcp=", value, &valueLen);
  615. SetDhcpStateStr(value);
  616. if (strncmp(value, "on", 2) != 0) // Если dhcp off устанавливаем параметры
  617. {
  618. memset(value, 0, len);
  619. GetParamValue(buf, "ipaddr=", value, &valueLen);
  620. SetIPStr(value);
  621. memset(value, 0, len);
  622. GetParamValue(buf, "gw=", value, &valueLen);
  623. SetGatewayStr(value);
  624. memset(value, 0, len);
  625. GetParamValue(buf, "mask=", value, &valueLen);
  626. SetMaskStr(value);
  627. memset(value, 0, len);
  628. }
  629. memset(value, 0, len);
  630. GetParamValue(buf, "swauth=", value, &valueLen);
  631. SetAuthEnableStateStr(value);
  632. if (strncmp(value, "on", 2) == 0){
  633. /* параметры RADIUS*/
  634. memset(value, 0, len);
  635. GetParamValue(buf, "rs_enabled=", value, &valueLen);
  636. SetRDSEnableStateStr(value);
  637. if (strncmp(value, "on", 2) == 0) // Если raddius off устанавливаем параметры
  638. {
  639. memset(value, 0, len);
  640. GetParamValue(buf, "rs_server=", value, &valueLen);
  641. SetRDSIpStr(value);
  642. memset(value, 0, len);
  643. GetParamValue(buf, "rs_port=", value, &valueLen);
  644. SetRDSPortStr(value);
  645. memset(value, 0, len);
  646. GetParamValue(buf, "rs_pwd=", value, &valueLen);
  647. SetRDSPasswordkStr(value);
  648. memset(value, 0, len);
  649. GetParamValue(buf, "rs_key=", value, &valueLen);
  650. SetRDSKeyAccesstStr(value);
  651. memset(value, 0, len);
  652. }
  653. }
  654. memset(value, 0, len);
  655. // Параметры реле и сухих контактов
  656. GetParamValue(buf, "di1=", value, &valueLen);
  657. SetDINTypeActStr(value, 0);
  658. memset(value, 0, len);
  659. GetParamValue(buf, "ro1=", value, &valueLen);
  660. SetROTypeActStr(value, 0);
  661. memset(value, 0, len);
  662. GetParamValue(buf, "ro2=", value, &valueLen);
  663. SetROTypeActStr(value, 1);
  664. memset(value, 0, len);
  665. GetParamValue(buf, "utc=", value, &valueLen);
  666. SetSntpTimeZoneStr(value);
  667. memset(value, 0, len);
  668. // Параметры даты и времени
  669. GetParamValue(buf, "ntp=", value, &valueLen);
  670. if (strncmp(value, "1", 1) == 0) // Если ntp on устанавливаем параметры
  671. {
  672. bool old_sntp = false;
  673. bool enable_old_sntp = sSettings.sSNTP.sntpEnable;
  674. memset(str, 0, len);
  675. GetParamValue(buf, "ntpservip=", str, &valueLen);
  676. if(strncmp(str, sSettings.sSNTP.ip, valueLen))
  677. old_sntp = true;
  678. SetSntpServerIpStr(str);
  679. SetSntpStateStr(value);
  680. if(sSettings.sSNTP.sntpEnable != enable_old_sntp)
  681. old_sntp = true;
  682. if(old_sntp){
  683. SNTP_Init();
  684. //vTaskDelay(7000);
  685. SNTP_Poll();
  686. }
  687. memset(value, 0, len);
  688. memset(str, 0, len);
  689. }
  690. else if (strncmp(value, "0", 1) == 0){
  691. SetSntpStateStr(value);
  692. memset(value, 0, len);
  693. GetParamValue(buf, "date=", value, &valueLen);
  694. SetDateStr(value);
  695. memset(value, 0, len);
  696. GetParamValue(buf, "time=", value, &valueLen);
  697. memset(str, 0, len);
  698. url_decode(str, sizeof(str), value);
  699. SetTimeStr(str);
  700. memset(value, 0, len);
  701. memset(str, 0, len);
  702. }
  703. /* Если параметры WEB изменились выставляем флаг, сохраняем настройки и перезагружаемся */
  704. if (GetStateWebReinit() == true)
  705. {
  706. SetWebReinitFlag(true);
  707. HTTP_SaveSettings();
  708. /* Блокируем управление ключем на тау секунд*/
  709. //IO_KeyBlockOn();
  710. vTaskDelay(1010);
  711. Reboot();
  712. }
  713. HTTP_SaveSettings();
  714. }
  715. /**
  716. * @brief
  717. * @retval None
  718. */
  719. void HTTP_SetInfo(char *buf, uint16_t lenBuf)
  720. {
  721. uint8_t valueLen = 0;
  722. const uint8_t len = 110;
  723. char value[110];
  724. char str[110];
  725. // ClearParamString(buf);
  726. memset(value, 0, len);
  727. /* Владелец */
  728. GetParamValue(buf, "owner=", value, &valueLen);
  729. url_decode(str, sizeof(str), value);
  730. SetOwner(str);
  731. memset(value, 0, len);
  732. /* Владелец */
  733. GetParamValue(buf, "sysLocation=", value, &valueLen);
  734. url_decode(str, sizeof(str), value);
  735. SetLocation(str);
  736. memset(value, 0, len);
  737. /* Комментарий */
  738. GetParamValue(buf, "comment=", value, &valueLen);
  739. url_decode(str, sizeof(str), value);
  740. SetComment(str);
  741. memset(value, 0, len);
  742. HTTP_SaveSettings();
  743. }
  744. /**
  745. * @brief Запуск/останов теста UPS
  746. */
  747. void HTTP_UPSTest(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  748. {
  749. uint8_t valueLen = 0;
  750. char tempValue[20];
  751. char tempValue2[20];
  752. int8_t res = 0;
  753. char log_string[50];
  754. memset(tempValue, 0, 20);
  755. memset(tempValue2, 0, 20);
  756. memset(log_string, 0,50);
  757. strcpy(bufOut, HTTP_200_OK);
  758. GetParamValue(bufIn, "func=", tempValue, &valueLen);
  759. if (strcmp(tempValue, "stop") == 0){
  760. res = ups_metac_service_pdu(ups_cancel_test);
  761. if(res == 1 || res == 0){
  762. strcat(bufOut, "Тест остановлен!");
  763. strcpy(log_string, name_login);
  764. strcat(log_string, " (Останов)");
  765. log_event_data(LOG_TEST_UPS, log_string);
  766. }
  767. if(res == -1)
  768. strcat(bufOut, "Тест не удалось остановить!");
  769. *lenBufOut = strlen(bufOut);
  770. }
  771. else if (strcmp(tempValue, "discharge") == 0){
  772. res = ups_metac_service_pdu(ups_test_low_bat);
  773. if(res == 1 || res == 0){
  774. strcat(bufOut, "Тест запущен!");
  775. strcpy(log_string, name_login);
  776. strcat(log_string, " (Запущен)");
  777. log_event_data(LOG_TEST_UPS, log_string);
  778. }
  779. if(res == -1)
  780. strcat(bufOut, "Тест не удалось запустить!");
  781. *lenBufOut = strlen(bufOut);
  782. }
  783. else if (strncmp(tempValue, "time", 6) == 0){
  784. GetParamValue(bufIn, "=", tempValue2, &valueLen);
  785. TimeParam = atoi(tempValue2);
  786. res = ups_metac_service_pdu(ups_test_time);
  787. if(res == 1 || res == 0){
  788. strcat(bufOut, "Тест запущен!");
  789. strcpy(log_string, name_login);
  790. strcat(log_string, " (Запущен)");
  791. log_event_data(LOG_TEST_UPS, log_string);
  792. }
  793. if(res == -1)
  794. strcat(bufOut, "Тест не удалось запустить!");
  795. *lenBufOut = strlen(bufOut);
  796. }
  797. }
  798. /**
  799. * @brief Выклюение UPS
  800. */
  801. void HTTP_UPSshutdown(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  802. {
  803. uint8_t valueLen = 0;
  804. char *valueLenEnd = 0;
  805. char tempValue[50];
  806. char tempValue2[50];
  807. int8_t res = 0;
  808. char log_string[50];
  809. memset(tempValue, 0, 50);
  810. memset(log_string, 0,50);
  811. strcpy(bufOut, HTTP_200_OK);
  812. GetParamValue(bufIn, "func=", tempValue, &valueLen);
  813. if (strcmp(tempValue, "reboot") == 0){
  814. res = ups_metac_service_pdu(ups_cancel_shut_down);
  815. if(res == 1){
  816. strcpy(log_string, name_login);
  817. strcat(log_string, " (Останов)");
  818. log_event_data(LOG_SHUTDOWN_UPS, log_string);
  819. strcat(bufOut, "Выключение нагрузки ИБП отменено!");
  820. }
  821. else
  822. strcat(bufOut, "Выключение нагрузки ИБП не удалось отменить!");
  823. *lenBufOut = strlen(bufOut);
  824. }
  825. else if (strncmp(tempValue, "off", 5) == 0){
  826. memset(tempValue2, 0, 50);
  827. GetParamValue(bufIn, "after=", tempValue2, &valueLen);
  828. TimeParamFloat = atof(tempValue2);
  829. res = ups_metac_service_pdu(ups_shutdown);
  830. if(res == 1){
  831. strcat(bufOut, "Отключение нагрузки ИБП!");
  832. log_event_data(LOG_SHUTDOWN_UPS, name_login);
  833. }else
  834. strcat(bufOut, "Отключение нагрузки ИБП не удалось!");
  835. *lenBufOut = strlen(bufOut);
  836. }
  837. }
  838. /**
  839. * @brief Проверка пароля для перехода в режим bootloader
  840. * @retval None
  841. */
  842. void HTTP_ConfirmBootPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  843. {
  844. char tempStr[50];
  845. strncpy(tempStr, bufIn, 50);
  846. char value[20];
  847. uint8_t valueLen;
  848. memset(value, 0, 20);
  849. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  850. отправить ответ серверу о статусе пароля */
  851. HTTP_StartResetTask(true);
  852. }
  853. void LoginTimerCallback(TimerHandle_t pxTimer) {
  854. cnt_err_psw = 0;
  855. DBG printf("cnt_err_psw %d", cnt_err_psw);
  856. xTimerStop(RepeatLoginTimer, 0);
  857. }
  858. /**
  859. * @brief Проверка пароля для входа в Web
  860. * @retval None
  861. */
  862. int HTTP_ConfirmWebPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  863. {
  864. char tempStr[50];
  865. char login[20];
  866. char password[20];
  867. uint8_t valueLen, user_id;
  868. char *strPtr = 0;
  869. char WebPassword[MAX_WEB_PASSWD_LEN];
  870. char WebLogin[MAX_WEB_LOGIN_LEN];
  871. memset(login, 0, 20);
  872. memset(password, 0, 20);
  873. memset(tempStr, 0, 50);
  874. memset(name_login, 0, 50);
  875. /* Get first 50 bytes of string */
  876. strncpy(tempStr, bufIn, 49);
  877. /* Add " " to the string in order GetParamValue() can be able to parse the param */
  878. strcat(tempStr, " ");
  879. GetParamValue(tempStr, "login=", login, &valueLen);
  880. GetParamValue(tempStr, "password=", password, &valueLen);
  881. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
  882. switch(RC_Login(login, password)){
  883. case RC_ERROR:
  884. Authenticated = false;
  885. break;
  886. case RC_LOGIN_ADMIN_OK:
  887. Authenticated = true;
  888. user_id = 0;
  889. break;
  890. case RC_LOGIN_USER_OK:
  891. Authenticated = true;
  892. user_id = 1;
  893. break;
  894. case RC_NET_ERR:
  895. Authenticated = false;
  896. fl_raddius_net_err = true;
  897. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type: text/html;\r\n\r\n");
  898. strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Ошибка соединения с RADIUS сервером</h2></center></html>");
  899. *lenBufOut = strlen(bufOut);
  900. return SEND_REQUIRED_NO;
  901. break;
  902. case RC_ACC_DENIED:
  903. Authenticated = false;
  904. break;
  905. default:
  906. break;
  907. }
  908. }
  909. else{
  910. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  911. GetUserLogin(user_id, WebLogin, &valueLen);
  912. GetUserPassword(user_id, WebPassword, &valueLen);
  913. /* Check login and password */
  914. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  915. (strncmp(WebPassword, password, MAX_WEB_PASSWD_LEN) == 0)) {
  916. /* Login and pass are valid */
  917. /* TODO replace global flag with user-pass-cookie */
  918. if(cnt_err_psw < 4){
  919. cnt_err_psw = 0;
  920. Authenticated = true;
  921. }
  922. else{
  923. Authenticated = false;
  924. }
  925. break;
  926. }
  927. else{
  928. Authenticated = false;
  929. }
  930. }
  931. }
  932. if(Authenticated){
  933. /* Generate cookie */
  934. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  935. /* Set users cookie */
  936. HTTP_SetUserCookie(tempStr, user_id);
  937. HTTP_UpdateUserLoginTime(user_id);
  938. /* Send login and cookie back */
  939. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
  940. strcat(bufOut, login);
  941. strcat(bufOut, "\r\nSet-Cookie: id=");
  942. strcat(bufOut, tempStr);
  943. sprintf(tempStr, "%d", user_id);
  944. strcat(bufOut, "\r\nSet-Cookie: role=");
  945. strcat(bufOut, tempStr);
  946. if(sSettings.sRADIUS.Auth_enable)
  947. strcat(bufOut, "\r\nSet-Cookie: auth=1");
  948. else
  949. strcat(bufOut, "\r\nSet-Cookie: auth=0");
  950. strcat(bufOut, "\r\n\r\n");
  951. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  952. *lenBufOut = strlen(bufOut);
  953. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
  954. snprintf(name_login, (strlen(login)+1), login);
  955. }
  956. else{
  957. fl_raddius_net_err = false;
  958. switch (user_id) {
  959. case 0:
  960. snprintf(name_login, sizeof(name_login), "Администратор");
  961. break;
  962. case 1:
  963. snprintf(name_login, sizeof(name_login), "Пользователь");
  964. break;
  965. default:
  966. snprintf(name_login, (strlen(login)+1), login);
  967. break;
  968. }
  969. }
  970. log_event_data(LOG_LOGIN, name_login);
  971. /* Запускаем задачу-таймер логаута. */
  972. /* TODO отправить ответ серверу о статусе пароля */
  973. return SEND_REQUIRED_YES;
  974. }
  975. else{
  976. if(cnt_err_psw <= 4)
  977. cnt_err_psw ++;
  978. DBG printf("cnt_err_psw %d", cnt_err_psw);
  979. if(cnt_err_psw == 4)
  980. xTimerStart(RepeatLoginTimer, 0);
  981. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type: text/html;\r\n\r\n");
  982. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false)){
  983. if(cnt_err_psw < 4)
  984. 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>");
  985. else
  986. strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/rslogin.html\" /></head><center><h2>Вход заблокирован!</h2></center></head><center><h2>Повторите попытку через 1 минуту</h2></center></html>");
  987. }
  988. else{
  989. if(cnt_err_psw < 4)
  990. 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>");
  991. else
  992. strcat(bufOut,"<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"refresh\" content=\"3; url=/login.html\" /></head><center><h2>Вход заблокирован!</h2></center></head><center><h2>Повторите попытку через 1 минуту</h2></center></html>");
  993. }
  994. *lenBufOut = strlen(bufOut);
  995. return SEND_REQUIRED_NO;
  996. }
  997. }
  998. void HTTP_LOGIN(char *bufOut, uint16_t *lenBufOut)
  999. {
  1000. char tempStr[50];
  1001. uint8_t valueLen;
  1002. char WebLogin[MAX_WEB_LOGIN_LEN];
  1003. GetUserLogin(ADMIN, WebLogin, &valueLen);
  1004. memset(tempStr, 0, 50);
  1005. memset(name_login, 0, 50);
  1006. /* TODO replace global flag with user-pass-cookie */
  1007. Authenticated = true;
  1008. /* Generate cookie */
  1009. sprintf(tempStr, "%X", (unsigned int)GetRandomNumber());
  1010. /* Set users cookie */
  1011. HTTP_SetUserCookie(tempStr, ADMIN);
  1012. HTTP_UpdateUserLoginTime(ADMIN);
  1013. /* Send login and cookie back */
  1014. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nSet-Cookie: uname=");
  1015. strcat(bufOut, WebLogin);
  1016. strcat(bufOut, "\r\nSet-Cookie: id=");
  1017. strcat(bufOut, tempStr);
  1018. strcat(bufOut, "\r\nSet-Cookie: role=0");
  1019. if(sSettings.sRADIUS.Auth_enable)
  1020. strcat(bufOut, "\r\nSet-Cookie: auth=1");
  1021. else
  1022. strcat(bufOut, "\r\nSet-Cookie: auth=0");
  1023. strcat(bufOut, "\r\n\r\n");
  1024. strcat(bufOut,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/index.html\"/></head></html>\r\n\r\n");
  1025. *lenBufOut = strlen(bufOut);
  1026. snprintf(name_login, sizeof(name_login), "Администратор");
  1027. }
  1028. /**
  1029. * @brief
  1030. * @retval None
  1031. */
  1032. uint8_t GetParamValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  1033. {
  1034. char *beginValue = 0;
  1035. char *endValue = 0;
  1036. int len = 0;
  1037. char *strPtr = 0;
  1038. strPtr = strstr(inStr, paramName);
  1039. if (strPtr != 0)
  1040. {
  1041. beginValue = strpbrk(strPtr,"=");
  1042. endValue = strpbrk(strPtr,"&");
  1043. if (endValue == 0)
  1044. endValue = strpbrk(strPtr," ");
  1045. len = endValue - beginValue - 1;
  1046. strncpy(paramValue, beginValue + 1, len);
  1047. *endValue = '0';
  1048. *beginValue = '0';
  1049. *paramLen = len;
  1050. return 1;
  1051. }
  1052. else
  1053. {
  1054. *paramLen = 0;
  1055. return 0;
  1056. }
  1057. }
  1058. /**
  1059. * @brief
  1060. * @retval None
  1061. */
  1062. uint8_t GetCookieValue(char *inStr, char *paramName, char *paramValue, uint8_t *paramLen)
  1063. {
  1064. char *beginValue = 0;
  1065. char *endValue = 0;
  1066. int len = 0;
  1067. char *strPtr = 0;
  1068. strPtr = strstr(inStr, paramName);
  1069. if (strPtr != 0)
  1070. {
  1071. beginValue = strpbrk(strPtr,"=");
  1072. endValue = strpbrk(strPtr,";");
  1073. if (endValue == 0)
  1074. endValue = strpbrk(strPtr,"\n");
  1075. len = endValue - beginValue - 1;
  1076. strncpy(paramValue, beginValue + 1, len);
  1077. *endValue = '0';
  1078. *beginValue = '0';
  1079. *paramLen = len;
  1080. return 1;
  1081. }
  1082. else
  1083. {
  1084. *paramLen = 0;
  1085. return 0;
  1086. }
  1087. }
  1088. char* Parce_Boundary(const char* data, uint32_t len, char* dst, uint8_t dstlen) {
  1089. char *ptr = NULL;
  1090. char *boundary = NULL;
  1091. uint8_t i = 0;
  1092. for (uint32_t j = 0; j < len; j++) {
  1093. if (strncmp ((char*)(data + j), "boundary=", 9) == 0) {
  1094. boundary = (char*)data + j + 9;
  1095. break;
  1096. }
  1097. }
  1098. if (!boundary) return NULL;
  1099. *dst++ = '-';
  1100. *dst++ = '-';
  1101. ptr = boundary;
  1102. while ((*ptr != 0x0d) && (i < dstlen - 4))
  1103. {
  1104. *dst++ = *ptr++;
  1105. i++;
  1106. }
  1107. //*dst++ = '-';
  1108. //*dst++ = '-';
  1109. *dst = '\0';
  1110. if (i > 0)
  1111. return boundary;
  1112. else
  1113. return NULL;
  1114. }
  1115. void ClearParamString(char *inBuf)
  1116. {
  1117. uint16_t len;
  1118. char *str;
  1119. str = strstr(inBuf, "HTTP");
  1120. if (str != 0)
  1121. {
  1122. len = str - inBuf;
  1123. memset(str, 0, RECIVE_BUF_MAX_LEN - len - 1);
  1124. }
  1125. }
  1126. /**
  1127. * @brief Чтение Cookie пользователя
  1128. */
  1129. static void HTTP_GetUserCookie(uint8_t user_id, char *str, uint8_t *len)
  1130. {
  1131. sprintf(str, "%s", users[user_id].cookie);
  1132. *len = strlen(str);
  1133. }
  1134. /**
  1135. * @brief Установка Cookie пользователя
  1136. */
  1137. static void HTTP_SetUserCookie(char *str, uint8_t user_id)
  1138. {
  1139. strcpy(users[user_id].cookie, str);
  1140. }
  1141. /**
  1142. * @brief Обновление времени последней активности пользователя
  1143. */
  1144. static void HTTP_UpdateUserLoginTime(uint8_t user_id)
  1145. {
  1146. xTimerStart(users[user_id].LogoutTimer, 0);
  1147. }
  1148. /**
  1149. * @brief Extract the Content_Length data from HTML data
  1150. * @param data : pointer on receive packet buffer
  1151. * @param len : buffer length
  1152. * @retval size : Content_length in numeric format
  1153. */
  1154. static uint32_t Parse_Content_Length(char *data, uint32_t len)
  1155. {
  1156. uint32_t i=0,size=0, S=1;
  1157. int32_t j=0;
  1158. char sizestring[6], *ptr;
  1159. ContentLengthOffset =0;
  1160. /* find Content-Length data in packet buffer */
  1161. for (i=0;i<len;i++)
  1162. {
  1163. if (strncmp ((char*)(data+i), Content_Length, 16)==0)
  1164. {
  1165. ContentLengthOffset = i+16;
  1166. break;
  1167. }
  1168. }
  1169. /* read Content-Length value */
  1170. if (ContentLengthOffset)
  1171. {
  1172. i=0;
  1173. ptr = (char*)(data + ContentLengthOffset);
  1174. while(*(ptr+i)!=0x0d)
  1175. {
  1176. sizestring[i] = *(ptr+i);
  1177. i++;
  1178. ContentLengthOffset++;
  1179. }
  1180. if (i>0)
  1181. {
  1182. /* transform string data into numeric format */
  1183. for(j=i-1;j>=0;j--)
  1184. {
  1185. size += (sizestring[j]-0x30)*S;
  1186. S=S*10;
  1187. }
  1188. }
  1189. }
  1190. return size;
  1191. }
  1192. /**
  1193. * @brief Принудительный логаут пользователя
  1194. */
  1195. static void HTTP_ForceUserLogout(uint8_t user_id)
  1196. {
  1197. char cookie[MAX_WEB_COOKIE_LEN];
  1198. /* Flush user cookie by random value */
  1199. sprintf(cookie, "%X", (unsigned int)GetRandomNumber());
  1200. HTTP_SetUserCookie(cookie, user_id);
  1201. }
  1202. /**
  1203. * @brief >Callback таймера логаута пользователя
  1204. */
  1205. void LogoutTimerCallback(TimerHandle_t pxTimer) {
  1206. uint8_t user_id = (uint8_t)pvTimerGetTimerID( pxTimer );
  1207. if( sSettings.sRADIUS.Auth_enable )
  1208. HTTP_ForceUserLogout(user_id);
  1209. }
  1210. /**
  1211. * @brief Смена пароля пользователя
  1212. * @retval None
  1213. */
  1214. int HTTP_ChangeUserPwd(char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  1215. {
  1216. char tempStr[110];
  1217. char value[20];
  1218. char login[20];
  1219. char password[20];
  1220. uint8_t valueLen, valueLen2, user_id;
  1221. char WebLogin[MAX_WEB_LOGIN_LEN];
  1222. (void)lenBufIn;
  1223. memset(login, 0, 20);
  1224. memset(password, 0, 20);
  1225. memset(tempStr, 0, 50);
  1226. memset(value, 0, 20);
  1227. ClearParamString(bufIn);
  1228. strncpy(tempStr, bufIn, 110);
  1229. strcpy(bufOut, HTTP_200_OK);
  1230. if (GetParamValue(tempStr, "username=", login, &valueLen) &&
  1231. GetParamValue(tempStr, "oldpass=", password, &valueLen))
  1232. {
  1233. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++)
  1234. {
  1235. memset(value, 0, 20);
  1236. memset(WebLogin, 0, MAX_WEB_LOGIN_LEN);
  1237. GetUserLogin(user_id, WebLogin, &valueLen);
  1238. GetUserPassword(user_id, value, &valueLen2);
  1239. /* Check login and password */
  1240. if ((strncmp(WebLogin, login, MAX_WEB_LOGIN_LEN) == 0) &&
  1241. (memcmp(password, value, 11) == 0))
  1242. {
  1243. memset(password, 0, 20);
  1244. if (GetParamValue(tempStr, "newpass=", password, &valueLen))
  1245. {
  1246. memcpy(sSettings.sAuth[user_id].password, password, 11);
  1247. HTTP_SaveSettings();
  1248. log_event_data(LOG_PSW_CHANGE, name_login);
  1249. strcat(bufOut, "Пароль успешно изменён");
  1250. *lenBufOut = strlen(bufOut);
  1251. return SEND_REQUIRED_YES;
  1252. }
  1253. else {
  1254. strcat(bufOut, "Введены некорректные данные!");
  1255. *lenBufOut = strlen(bufOut);
  1256. return SEND_REQUIRED_YES;
  1257. }
  1258. }
  1259. }
  1260. strcat(bufOut, "Введён неверный пароль!");
  1261. *lenBufOut = strlen(bufOut);
  1262. return SEND_REQUIRED_YES;
  1263. }
  1264. else {
  1265. strcat(bufOut, "Введены некорректные данные!");
  1266. *lenBufOut = strlen(bufOut);
  1267. return SEND_REQUIRED_YES;
  1268. }
  1269. }
  1270. // -----------------------------------------------------------------------------
  1271. #include "mbedtls/platform.h"
  1272. #include "mbedtls/entropy.h"
  1273. #include "mbedtls/ctr_drbg.h"
  1274. #include "mbedtls/certs.h"
  1275. #include "mbedtls/x509.h"
  1276. #include "mbedtls/net_sockets.h"
  1277. #include "mbedtls/error.h"
  1278. #include "mbedtls/debug.h"
  1279. #include "mbedtls/memory_buffer_alloc.h"
  1280. #include "mbedtls_time.h"
  1281. #include "mbedtls_debug.h"
  1282. #include "FreeRTOS.h"
  1283. #include "task.h"
  1284. #include "cert_req.h"
  1285. #include <stdlib.h>
  1286. #include <string.h>
  1287. extern unsigned char req_cert[];
  1288. static mbedtls_net_context listen_fd, client_fd;
  1289. static const uint8_t *pers = (uint8_t *)("ssl_server");
  1290. mbedtls_entropy_context entropy;
  1291. mbedtls_ctr_drbg_context ctr_drbg;
  1292. mbedtls_ssl_context ssl;
  1293. mbedtls_ssl_config conf;
  1294. mbedtls_x509_crt srvcert;
  1295. mbedtls_pk_context pkey;
  1296. char CookieBuf[51];
  1297. char *CookiePtr = NULL;
  1298. char name[MAX_WEB_COOKIE_LEN];
  1299. char id[MAX_WEB_COOKIE_LEN];
  1300. uint8_t nameLen = 0, idLen = 0;
  1301. uint8_t user_id; // Id of currently logged-in user
  1302. struct fs_file file = {0, 0};
  1303. //
  1304. void Cockie(void)
  1305. {
  1306. char* endPtr;
  1307. uint32_t len;
  1308. receiveBuf[receivedBufLen] = '\0';
  1309. //printf("receive %s \r\n", receiveBuf);
  1310. // Get cookie "uname" value
  1311. memset(CookieBuf, 0, sizeof(CookieBuf));
  1312. CookiePtr = strstr(receiveBuf, "uname=");
  1313. endPtr = strstr(CookiePtr, "\r");
  1314. len = (endPtr - CookiePtr)+2;
  1315. if(len < 50)
  1316. strncpy(CookieBuf, CookiePtr,len);
  1317. else
  1318. strncpy(CookieBuf, CookiePtr, 50);
  1319. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  1320. memset(name, 0, MAX_WEB_COOKIE_LEN);
  1321. GetCookieValue(CookieBuf, "uname=", name, &nameLen);
  1322. //printf("********CookieBuf2= %s\r\n", CookieBuf);
  1323. //printf("********uname= %s\r\n", name);
  1324. memset(CookieBuf, 0, sizeof(CookieBuf));
  1325. // Get cookie "id" value
  1326. CookiePtr = strstr(receiveBuf, " id=");
  1327. if(len < 50)
  1328. strncpy(CookieBuf, CookiePtr,len);
  1329. else
  1330. strncpy(CookieBuf, CookiePtr, 50);
  1331. //printf("********CookieBuf1= %s\r\n", CookieBuf);
  1332. memset(id, 0, MAX_WEB_COOKIE_LEN);
  1333. GetCookieValue(CookieBuf, "id=", id, &idLen);
  1334. // printf("********ID= %s\r\n", id);
  1335. }
  1336. //
  1337. void getAuthenticatedState(void)
  1338. {
  1339. seclevel = 0xFF;
  1340. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  1341. HTTP_GetUserCookie(user_id, CookieBuf, &idLen);
  1342. if (strncmp(id, CookieBuf, idLen) == 0 ) {
  1343. GetUserLevelInt(user_id, &seclevel);
  1344. Authenticated = true;
  1345. break;
  1346. }
  1347. Authenticated = false;
  1348. seclevel = 0xFF;
  1349. }
  1350. }
  1351. //
  1352. void ssl_server(void *pvParameters)
  1353. {
  1354. SSL_SERVER_STATE ssl_state = SSL_ACCEPT;
  1355. char* sendPtr;
  1356. int ret;
  1357. mbedtls_net_init( &listen_fd );
  1358. mbedtls_net_init( &client_fd );
  1359. mbedtls_ssl_init( &ssl );
  1360. mbedtls_ssl_config_init( &conf );
  1361. mbedtls_x509_crt_init( &srvcert );
  1362. mbedtls_pk_init( &pkey );
  1363. mbedtls_entropy_init( &entropy );
  1364. mbedtls_ctr_drbg_init( &ctr_drbg );
  1365. mbedtls_platform_set_time(&MBEDTLS_GetTime);
  1366. #if defined(MBEDTLS_DEBUG_C)
  1367. mbedtls_debug_set_threshold(DEBUG_LEVEL);
  1368. mbedtls_ssl_conf_dbg(&conf, MBEDTLS_Debug, NULL);
  1369. #endif
  1370. // 1. Load the certificates and private RSA key
  1371. mbedtls_printf( "\r\n . Loading the server cert. and key..." );
  1372. ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) sSettings.our_srv_crt, (strlen(sSettings.our_srv_crt) + 1) );//mbedtls_test_srv_crtmbedtls_test_srv_crt_len
  1373. if( ret != 0 )
  1374. {
  1375. mbedtls_printf( " failed\r\n ! mbedtls_x509_crt_parse returned %d\r\n", ret );
  1376. ssl_state = SSL_CRITICAL_ERROR;
  1377. }
  1378. ret = mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_srv_key, mbedtls_test_srv_key_len, NULL, 0 );
  1379. if( ret != 0 )
  1380. {
  1381. mbedtls_printf( " failed\r\n ! mbedtls_pk_parse_key returned %d\r\n", ret );
  1382. ssl_state = SSL_CRITICAL_ERROR;
  1383. }
  1384. mbedtls_printf( " ok\r\n" );
  1385. // 2. Setup the listening TCP socket
  1386. mbedtls_printf( " . Bind on https://localhost:443/ ..." );
  1387. if((ret = mbedtls_net_bind(&listen_fd, NULL, "443", MBEDTLS_NET_PROTO_TCP )) != 0)
  1388. {
  1389. mbedtls_printf( " failed\n ! mbedtls_net_bind returned %d\r\n", ret );
  1390. ssl_state = SSL_CRITICAL_ERROR;
  1391. }
  1392. mbedtls_printf( " ok\r\n" );
  1393. // 3. Seed the RNG
  1394. mbedtls_printf( " . Seeding the random number generator..." );
  1395. if((ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen( (char *)pers))) != 0)
  1396. {
  1397. mbedtls_printf( " failed\r\n ! mbedtls_ctr_drbg_seed returned %d\r\n", ret );
  1398. ssl_state = SSL_CRITICAL_ERROR;
  1399. }
  1400. mbedtls_printf( " ok\r\n" );
  1401. // 4. Setup stuff
  1402. mbedtls_printf( " . Setting up the SSL data...." );
  1403. if( ( ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0)
  1404. {
  1405. mbedtls_printf( " failed\r\n ! mbedtls_ssl_config_defaults returned %d\r\n", ret );
  1406. ssl_state = SSL_CRITICAL_ERROR;
  1407. }
  1408. mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg);
  1409. mbedtls_ssl_conf_ca_chain(&conf, srvcert.next, NULL);
  1410. if( ( ret = mbedtls_ssl_conf_own_cert(&conf, &srvcert, &pkey ) ) != 0)
  1411. {
  1412. mbedtls_printf( " failed\r\n ! mbedtls_ssl_conf_own_cert returned %d\r\n", ret );
  1413. ssl_state = SSL_CRITICAL_ERROR;
  1414. }
  1415. if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )
  1416. {
  1417. mbedtls_printf( " failed\r\n ! mbedtls_ssl_setup returned %d\r\n", ret );
  1418. ssl_state = SSL_CRITICAL_ERROR;
  1419. }
  1420. mbedtls_printf( " ok\r\n" );
  1421. for (;;) {
  1422. switch (ssl_state)
  1423. {
  1424. case SSL_ACCEPT :
  1425. mbedtls_ssl_session_reset( &ssl );
  1426. mbedtls_printf( " . Waiting for a remote connection ...\r\n" );
  1427. if((ret = mbedtls_net_accept(&listen_fd, &client_fd, NULL, 0, NULL)) != 0) {
  1428. mbedtls_printf( " failed\r\n ! mbedtls_net_accept returned %d\r\n", ret );
  1429. ssl_state = SSL_ERROR;
  1430. }
  1431. else {
  1432. mbedtls_ssl_set_bio( &ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv, NULL );//mbedtls_net_recv
  1433. mbedtls_printf( " ok\r\n" );
  1434. ssl_state = SSL_HANDSHAKE;
  1435. }
  1436. break;
  1437. case SSL_HANDSHAKE :
  1438. mbedtls_printf( " . Performing the SSL/TLS handshake..." );
  1439. while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )
  1440. {
  1441. if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
  1442. {
  1443. mbedtls_printf( " failed\r\n ! mbedtls_ssl_handshake returned %d\r\n", ret );
  1444. ssl_state = SSL_ERROR;
  1445. break;
  1446. }
  1447. }
  1448. if (ret != 0)
  1449. ssl_state = SSL_ERROR;
  1450. else {
  1451. mbedtls_printf( " ok\r\n" );
  1452. ssl_state = SSL_READ;
  1453. }
  1454. break;
  1455. case SSL_READ :
  1456. //printf("SSL_READ\r\n");
  1457. if (SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf) <= 0)
  1458. ssl_state = SSL_ERROR;
  1459. else
  1460. ssl_state = SSL_PROCESSING;
  1461. break;
  1462. case SSL_PROCESSING :
  1463. //printf("SSL_PROCESSING\r\n");
  1464. sendPtr = SSL_ProcessingRoutine(&sendBufLoadLen);
  1465. if (sendPtr)
  1466. ssl_state = SSL_WRITE;
  1467. else
  1468. ssl_state = SSL_ACCEPT;
  1469. break;
  1470. case SSL_WRITE :
  1471. //printf("SSL_WRITE\r\n");
  1472. SSL_WriteRoutine(&ssl, sendPtr, sendBufLoadLen);
  1473. ssl_state = SSL_CLOSE;
  1474. break;
  1475. case SSL_CLOSE :
  1476. //printf("SSL_CLOSE\r\n");
  1477. mbedtls_ssl_close_notify(&ssl);
  1478. mbedtls_net_free(&client_fd);
  1479. //mbedtls_ssl_free( &ssl );
  1480. ssl_state = SSL_ACCEPT;
  1481. break;
  1482. case SSL_ERROR :
  1483. //printf("SSL_ERROR\r\n");
  1484. //mbedtls_net_free(&client_fd);
  1485. //mbedtls_ssl_free( &ssl );
  1486. mbedtls_ssl_close_notify(&ssl);
  1487. mbedtls_net_free(&client_fd);
  1488. ssl_state = SSL_ACCEPT;
  1489. break;
  1490. case SSL_CRITICAL_ERROR:
  1491. //printf("SSL_CRITICAL_ERROR\r\n");
  1492. mbedtls_x509_crt_free( &srvcert );
  1493. mbedtls_pk_free( &pkey );
  1494. mbedtls_ssl_free( &ssl );
  1495. mbedtls_ssl_config_free( &conf );
  1496. mbedtls_ctr_drbg_free( &ctr_drbg );
  1497. mbedtls_entropy_free( &entropy );
  1498. vTaskDelete(NULL);
  1499. break;
  1500. }
  1501. }
  1502. }
  1503. /**
  1504. * @brief Initialize the HTTPS server (start its thread)
  1505. */
  1506. void HTTPS_Init()
  1507. {
  1508. char buf[MAX_WEB_COOKIE_LEN];
  1509. uint8_t user_id;
  1510. for (user_id = 0; user_id < MAX_WEB_USERS; user_id++) {
  1511. // Flush user cookie by random value
  1512. sprintf(buf, "%X", (unsigned int)GetRandomNumber());
  1513. HTTP_SetUserCookie(buf, user_id);
  1514. // Create user logout timers
  1515. users[user_id].LogoutTimer = xTimerCreate("LogoutTmr", WEB_LOGOUT_TIME, pdFALSE, ( void * ) user_id, LogoutTimerCallback);
  1516. }
  1517. RepeatLoginTimer = xTimerCreate("LoginTmr", REPEAT_LOGIN_TIME, pdFALSE, ( void * ) 0, LoginTimerCallback);
  1518. }
  1519. //
  1520. int SSL_ReadRoutine(mbedtls_ssl_context *ssl, unsigned char* recvBuf)
  1521. {
  1522. int ret;
  1523. mbedtls_printf( " < Read from client:" );
  1524. do
  1525. {
  1526. receivedBufLen = RECIVE_BUF_MAX_LEN - 1;
  1527. memset(recvBuf, 0, RECIVE_BUF_MAX_LEN);
  1528. ret = mbedtls_ssl_read(ssl, receiveBuf, receivedBufLen);
  1529. if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )
  1530. continue;
  1531. if( ret <= 0 )
  1532. {
  1533. switch( ret )
  1534. {
  1535. case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:
  1536. mbedtls_printf( " connection was closed gracefully\r\n" );
  1537. break;
  1538. case MBEDTLS_ERR_NET_CONN_RESET:
  1539. mbedtls_printf( " connection was reset by peer\r\n" );
  1540. break;
  1541. default:
  1542. mbedtls_printf( "mbedtls_ssl_read returned -0x%x\r\n", -ret );
  1543. break;
  1544. }
  1545. return ret;
  1546. }
  1547. receivedBufLen = ret;
  1548. } while(0);
  1549. }
  1550. //
  1551. SSL_SERVER_STATE SSL_WriteRoutine(mbedtls_ssl_context *ssl, char *data, int datalen)
  1552. {
  1553. return SSL_SendFrames(ssl, data, datalen);
  1554. }
  1555. //
  1556. char* SSL_ProcessingRoutine(uint16_t* sendLen)
  1557. {
  1558. Cockie();
  1559. getAuthenticatedState();
  1560. if ( Authenticated == false && sSettings.sRADIUS.Auth_enable == false)
  1561. {
  1562. HTTP_LOGIN(sendBuf, sendLen);
  1563. return sendBuf;
  1564. }
  1565. else if (!Authenticated)
  1566. {
  1567. return AuthenticatedFalseRoutine(sendLen);
  1568. }
  1569. else
  1570. {
  1571. return AuthenticatedTrueRoutine(sendLen);
  1572. }
  1573. }
  1574. //
  1575. char* AuthenticatedFalseRoutine(uint16_t* sendLen)
  1576. {
  1577. if (strncmp(receiveBuf, "GET /main.css", 13) == 0) // +
  1578. {
  1579. fs_open("/main.css", &file);
  1580. *sendLen = file.len;
  1581. return file.data;
  1582. }
  1583. else if (strncmp(receiveBuf, "GET /rotek.png", 14) == 0) // +
  1584. {
  1585. fs_open("/rotek.png", &file);
  1586. *sendLen = file.len;
  1587. return file.data;
  1588. }
  1589. else if (strncmp(receiveBuf, "GET /favicon.ico", 16) == 0) // ?
  1590. {
  1591. fs_open("/favicon.ico", &file);
  1592. *sendLen = file.len;
  1593. return file.data;
  1594. }
  1595. else if (strncmp(receiveBuf, "GET /role.js", 12) == 0)
  1596. {
  1597. fs_open("/role.js", &file);
  1598. *sendLen = file.len;
  1599. return file.data;
  1600. }
  1601. else if (strncmp(receiveBuf, "POST /login.cgi", 15) == 0)
  1602. {
  1603. uint32_t req_data_received = 0;
  1604. char *offset = 0;
  1605. post_data_count = Parse_Content_Length(receiveBuf, receivedBufLen);
  1606. if (post_data_count < MAX_POST_REQ_LEN)
  1607. {
  1608. memset(post_req_data, 0, MAX_POST_REQ_LEN);
  1609. offset = (strstr(receiveBuf, "\r\n\r\n")) + 4;
  1610. req_data_received = receivedBufLen - (offset - &receiveBuf[0]);
  1611. if (offset != 0)
  1612. {
  1613. if (req_data_received < post_data_count)
  1614. {
  1615. snprintf(post_req_data, req_data_received, "%s", receiveBuf);
  1616. post_data_count -= req_data_received;
  1617. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1618. offset = receiveBuf;
  1619. }
  1620. if(strlen(receiveBuf) != 0)
  1621. {
  1622. strncat(post_req_data, offset, post_data_count);
  1623. if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), sendLen) == SEND_REQUIRED_YES)
  1624. {
  1625. post_data_count = 0;
  1626. return sendBuf;
  1627. }
  1628. else
  1629. {
  1630. post_data_count = 0;
  1631. return sendBuf;
  1632. }
  1633. }
  1634. else
  1635. {
  1636. // Redirect to login page
  1637. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
  1638. fs_open("/rslogin.html", &file);
  1639. else
  1640. fs_open("/login.html", &file);
  1641. post_data_count = 0;
  1642. *sendLen = file.len;
  1643. return file.data;
  1644. }
  1645. }
  1646. // request was fragmented before "\r\n\r\n"
  1647. else
  1648. {
  1649. // Redirect to login page
  1650. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
  1651. fs_open("/rslogin.html", &file);
  1652. else
  1653. fs_open("/login.html", &file);
  1654. post_data_count = 0;
  1655. *sendLen = file.len;
  1656. return file.data;
  1657. }
  1658. }
  1659. else
  1660. {
  1661. //printf("Too long POST request!\r\n");
  1662. // Ignore request
  1663. post_data_count = 0;
  1664. // Redirect to login page
  1665. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
  1666. fs_open("/rslogin.html", &file);
  1667. else
  1668. fs_open("/login.html", &file);
  1669. *sendLen = file.len;
  1670. return file.data;
  1671. }
  1672. }
  1673. else if (post_data_count > 0)
  1674. {
  1675. strncat(post_req_data, receiveBuf, post_data_count);
  1676. post_data_count = 0;
  1677. log_post_reqn = 0;
  1678. if (HTTP_ConfirmWebPwd(post_req_data, sendBuf, strlen(post_req_data), sendLen) == SEND_REQUIRED_YES)
  1679. {
  1680. return sendBuf;
  1681. }
  1682. else
  1683. {
  1684. return sendBuf;
  1685. }
  1686. }
  1687. else
  1688. {
  1689. if((sSettings.sRADIUS.RDSEnable == true) && (fl_raddius_net_err == false))
  1690. fs_open("/rslogin.html", &file);
  1691. else
  1692. fs_open("/login.html", &file);
  1693. *sendLen = file.len;
  1694. return file.data;
  1695. }
  1696. }
  1697. //
  1698. char* AuthenticatedTrueRoutine(uint16_t* sendLen)
  1699. {
  1700. char *DataOffset;
  1701. char *ptr;
  1702. /* if (strncmp(receiveBuf, "GET /main.css", 13) == 0) // +
  1703. {
  1704. fs_open("/main.css", &file);
  1705. *sendLen = file.len;
  1706. return file.data;
  1707. }
  1708. else if (strncmp(receiveBuf, "GET /rotek.png", 14) == 0) // +
  1709. {
  1710. fs_open("/rotek.png", &file);
  1711. *sendLen = file.len;
  1712. return file.data;
  1713. }
  1714. else if (strncmp(receiveBuf, "GET /favicon.ico", 16) == 0) // ?
  1715. {
  1716. fs_open("/favicon.ico", &file);
  1717. *sendLen = file.len;
  1718. return file.data;
  1719. }
  1720. else if (strncmp(receiveBuf, "GET /main.js", 12) == 0) // +
  1721. {
  1722. fs_open("/main.js", &file);
  1723. *sendLen = file.len;
  1724. return file.data;
  1725. }
  1726. else if (strncmp(receiveBuf, "GET /role.js", 12) == 0)
  1727. {
  1728. fs_open("/role.js", &file);
  1729. *sendLen = file.len;
  1730. return file.data;
  1731. }
  1732. else if (strncmp(receiveBuf, "GET /settings.html", 18) == 0) // +
  1733. {
  1734. HTTP_UpdateUserLoginTime(user_id);
  1735. if (seclevel == 0)
  1736. fs_open("/settings.html", &file);
  1737. else
  1738. fs_open("/index.html", &file);
  1739. *sendLen = file.len;
  1740. return file.data;
  1741. }
  1742. else if (strncmp(receiveBuf, "GET /info.html", 14) == 0) // +
  1743. {
  1744. HTTP_UpdateUserLoginTime(user_id);
  1745. fs_open("/info.html", &file);
  1746. *sendLen = file.len;
  1747. return file.data;
  1748. }
  1749. else if (strncmp(receiveBuf, "GET /history.html", 17) == 0)
  1750. {
  1751. HTTP_UpdateUserLoginTime(user_id);
  1752. fs_open("/history.html", &file);
  1753. *sendLen = file.len;
  1754. return file.data;
  1755. }
  1756. else if (strncmp(receiveBuf, "GET /ups_history.html", 21) == 0)
  1757. {
  1758. HTTP_UpdateUserLoginTime(user_id);
  1759. fs_open("/ups_history.html", &file);
  1760. *sendLen = file.len;
  1761. return file.data;
  1762. }
  1763. else*/ if (strncmp(receiveBuf, "GET /getJson.cgi", 16) == 0) // +
  1764. {
  1765. HTTP_GetParamsPage1(sendBuf);
  1766. *sendLen = strlen(sendBuf);
  1767. return sendBuf;
  1768. }
  1769. else if (strncmp(receiveBuf, "GET /settings.cgi", 17) == 0) // +
  1770. {
  1771. if (seclevel == 0) {
  1772. SET_PAGE = SET_PAGE_PAGE2;
  1773. if (HTTP_SettingsPage(receiveBuf, sendBuf, receivedBufLen, sendLen) == SEND_REQUIRED_YES)
  1774. {
  1775. *sendLen = strlen(sendBuf);
  1776. return sendBuf;
  1777. }
  1778. }
  1779. return 0;
  1780. }
  1781. else if (strncmp(receiveBuf, "POST /settings.cgi", 18) == 0)
  1782. {
  1783. if (seclevel == 0)
  1784. {
  1785. DataOffset = 0;
  1786. // POST Packet received
  1787. TotalReceived = 0;
  1788. TotalData = 0;
  1789. memset(sendBuf, 0, strlen(sendBuf));
  1790. // parse packet for Content-length field
  1791. size = Parse_Content_Length(receiveBuf, receivedBufLen);
  1792. DataOffset = strstr(receiveBuf, "managerIP");
  1793. /* case of MSIE8 : we do not receive data in the POST packet*/
  1794. if (DataOffset == 0)
  1795. {
  1796. //ssl_server_read();
  1797. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1798. DataOffset = strstr(receiveBuf, "managerIP");
  1799. }
  1800. TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
  1801. TotalData += TotalReceived;
  1802. strncat(sendBuf, DataOffset, TotalReceived);
  1803. for (int i = TotalData; i < size; i ++)
  1804. {
  1805. //ssl_server_read();
  1806. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1807. strncat(sendBuf, receiveBuf, receivedBufLen);
  1808. TotalData += receivedBufLen;
  1809. }
  1810. // check if last data packet
  1811. if (TotalData == size)
  1812. {
  1813. DBG printf("State: Received %d bytes\r\n", (int)TotalData);
  1814. // printf("receive %s \r\n", sendBuf);
  1815. strncat(sendBuf, " ", 1);
  1816. HTTP_SetSettings(sendBuf, strlen(sendBuf));
  1817. memset(sendBuf, 0, size);
  1818. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
  1819. strcat(sendBuf, "\r\n\r\n");
  1820. strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/settings.html\"/></head></html>\r\n\r\n");
  1821. sendBufLoadLen = strlen(sendBuf);
  1822. *sendLen = sendBufLoadLen;
  1823. return sendBuf;
  1824. }
  1825. }
  1826. return 0;
  1827. }
  1828. else if (strncmp(receiveBuf, "GET /getcert.cgi", 16) == 0)
  1829. {
  1830. // Send HTTP header first (Safari needs it)
  1831. memset(sendBuf, 0, sizeof(sendBuf));
  1832. strcpy(sendBuf, HTTP_200_OK);
  1833. SSL_CreateReqCert();
  1834. strncpy(sendBuf, req_cert, strlen(req_cert));
  1835. *sendLen = strlen(sendBuf);
  1836. return sendBuf;
  1837. }
  1838. else if (strncmp(receiveBuf, "POST /srv_crt_upload.cgi", 24) == 0)
  1839. {
  1840. static char boundary[70];
  1841. static char *pbound = NULL;
  1842. char* ContentOffset = 0;
  1843. DataOffset = 0;
  1844. TotalData = 0;
  1845. memset(sendBuf, 0, sizeof(sendBuf));
  1846. //printf("receive %s \r\n", receiveBuf);
  1847. // parse packet for Content-length field
  1848. size = Parse_Content_Length(receiveBuf, receivedBufLen);
  1849. pbound = Parce_Boundary(receiveBuf, receivedBufLen, boundary, sizeof(boundary));
  1850. if (pbound != NULL)
  1851. {
  1852. ContentOffset = strstr(receiveBuf, boundary);
  1853. //ContentOffset += 4;
  1854. DataOffset = strstr(ContentOffset, "\r\n\r\n");
  1855. if( DataOffset != NULL )
  1856. DataOffset += 4;
  1857. }
  1858. // case of MSIE8 : we do not receive data in the POST packet
  1859. if (DataOffset == NULL)
  1860. {
  1861. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1862. receiveBuf[receivedBufLen] = '\0';
  1863. printf("receive2 %s \r\n", receiveBuf);
  1864. if (pbound != NULL)
  1865. {
  1866. ContentOffset = strstr(receiveBuf, boundary);
  1867. // ContentOffset += 4;
  1868. DataOffset = strstr(ContentOffset, "\r\n\r\n");
  1869. if( DataOffset != NULL )
  1870. DataOffset += 4;
  1871. }
  1872. }
  1873. TotalReceived = receivedBufLen - (uint32_t)(ContentOffset - receiveBuf);
  1874. TotalData += TotalReceived;
  1875. strncat(sendBuf, DataOffset, TotalReceived);
  1876. while(TotalData < size)
  1877. {
  1878. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1879. receiveBuf[receivedBufLen] = '\0';
  1880. //printf("receive3 %s \r\n", receiveBuf);
  1881. strncat(sendBuf, receiveBuf, receivedBufLen);
  1882. TotalData += receivedBufLen;
  1883. //printf("TotalData %d \r\n", TotalData);
  1884. /*printf("receivedBufLen %d \r\n", receivedBufLen);
  1885. printf("TotalData %d \r\n", TotalData);
  1886. printf("size %d \r\n", size);
  1887. printf("receive3 %s \r\n", (receiveBuf+receivedBufLen - 30));*/
  1888. }
  1889. printf("TotalData %d \r\n", TotalData);
  1890. // check if last data packet
  1891. if (TotalData == size)
  1892. {
  1893. printf("receive %s \r\n", sendBuf);
  1894. if(strstr(sendBuf, "BEGIN CERTIFICATE") != NULL)
  1895. {
  1896. DataOffset = strstr(sendBuf, "-----END CERTIFICATE");
  1897. uint32_t len_crt = (uint32_t)(DataOffset - sendBuf) + 25;
  1898. memset(sSettings.our_srv_crt, 0, sizeof(sSettings.our_srv_crt));
  1899. memcpy(sSettings.our_srv_crt, sendBuf, len_crt);
  1900. strcat(sendBuf, "\r\n");
  1901. HTTP_SaveSettings();
  1902. memset(sendBuf, 0, sizeof(sendBuf));
  1903. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n\r\n");
  1904. strcat(sendBuf,"1");
  1905. }
  1906. else
  1907. {
  1908. memset(sendBuf, 0, sizeof(sendBuf));
  1909. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n\r\n");
  1910. strcat(sendBuf,"Некорректный сертефикат");
  1911. }
  1912. *sendLen = strlen(sendBuf);
  1913. return sendBuf;
  1914. }
  1915. }
  1916. else if (strncmp(receiveBuf, "GET /info.cgi", 13) == 0) // +
  1917. {
  1918. if (HTTP_InfoPage(receiveBuf, sendBuf, receivedBufLen, sendLen) == SEND_REQUIRED_YES)
  1919. {
  1920. return sendBuf;
  1921. }
  1922. }
  1923. else if (strncmp(receiveBuf, "POST /info.cgi", 14) == 0)
  1924. {
  1925. if (seclevel == 0)
  1926. {
  1927. DataOffset = 0;
  1928. // POST Packet received
  1929. TotalReceived = 0;
  1930. TotalData = 0;
  1931. memset(sendBuf, 0, strlen(sendBuf));
  1932. // parse packet for Content-length field
  1933. size = Parse_Content_Length(receiveBuf, receivedBufLen);
  1934. DataOffset = strstr(receiveBuf, "owner");
  1935. // case of MSIE8 : we do not receive data in the POST packet
  1936. if (DataOffset == 0)
  1937. {
  1938. SSL_ReadRoutine(&ssl, (unsigned char*)receiveBuf);
  1939. DataOffset = strstr(receiveBuf, "owner");
  1940. }
  1941. TotalReceived = receivedBufLen - (DataOffset - &receiveBuf[0]);
  1942. TotalData += TotalReceived;
  1943. strncat(sendBuf, DataOffset, TotalReceived);
  1944. // check if last data packet
  1945. if (TotalReceived == size)
  1946. {
  1947. strncat(sendBuf, " ", 1);
  1948. HTTP_SetInfo(sendBuf, strlen(sendBuf));
  1949. DataFlag = 0;
  1950. BrowserFlag = 0;
  1951. memset(sendBuf, 0, size);
  1952. strcpy(sendBuf, "HTTP/1.1 200 OK\r\n");
  1953. strcat(sendBuf, "\r\n\r\n");
  1954. strcat(sendBuf,"<!DOCTYPE html><html lang=""><head><meta http-equiv=\"refresh\" content=\"0;url=/info.html\"/></head></html>\r\n\r\n");
  1955. *sendLen = strlen(sendBuf);
  1956. return sendBuf;
  1957. }
  1958. // not last data packet
  1959. else
  1960. {
  1961. // write data in flash
  1962. if(receivedBufLen)
  1963. {
  1964. strncat(sendBuf, ptr, receivedBufLen);
  1965. //memcpy(receiveBufTemp, ptr, receivedBufLen);
  1966. }
  1967. }
  1968. }
  1969. }
  1970. else if (strncmp(receiveBuf, "GET /history.cgi", 16) == 0)
  1971. {
  1972. int res;
  1973. res = HTTP_HistoryPage(receiveBuf, sendBuf, receivedBufLen, sendLen);
  1974. if (res == SEND_REQUIRED_FILE)
  1975. {
  1976. if (SSL_SendFrames(&ssl, sendBuf, sendBufLoadLen) == SSL_ERROR)
  1977. return 0;
  1978. HTTP_SendHistory();
  1979. return 0;
  1980. }
  1981. else if (res == SEND_REQUIRED_YES)
  1982. {
  1983. return sendBuf;
  1984. }
  1985. }
  1986. else if (strncmp(receiveBuf, "GET /ups_history.cgi", 19) == 0)
  1987. {
  1988. int res;
  1989. res = HTTP_UpsHistoryPage(receiveBuf, sendBuf, receivedBufLen, sendLen);
  1990. if (res == SEND_REQUIRED_FILE)
  1991. {
  1992. if (SSL_SendFrames(&ssl, sendBuf, sendBufLoadLen) == SSL_ERROR)
  1993. return 0;
  1994. HTTP_SendLog();
  1995. return 0;
  1996. }
  1997. else if (res == SEND_REQUIRED_YES)
  1998. {
  1999. return sendBuf;
  2000. }
  2001. }
  2002. /* Тест АКБ ИБП */
  2003. else if (strncmp(receiveBuf, "GET /bat_test.cgi", 17) == 0)
  2004. {
  2005. HTTP_UPSTest(receiveBuf, sendBuf, receivedBufLen, sendLen);
  2006. return sendBuf;
  2007. }
  2008. /* Выключение ИБП */
  2009. else if (strncmp(receiveBuf, "GET /ups_power.cgi", 18) == 0)
  2010. {
  2011. HTTP_UPSshutdown(receiveBuf, sendBuf, receivedBufLen, sendLen);
  2012. return sendBuf;
  2013. }
  2014. /* Сброс настроек и сохранине */
  2015. else if (strncmp(receiveBuf, "GET /reset.cgi", 14) == 0)
  2016. {
  2017. HTTP_ResetSettings();
  2018. HTTP_SaveSettings();
  2019. fs_open("/settings.html", &file);
  2020. *sendLen = file.len;
  2021. return file.data;
  2022. }
  2023. /* Перезагрузка контроллера */
  2024. else if (strncmp(receiveBuf, "GET /reboot.cgi", 15) == 0)
  2025. {
  2026. HTTP_Reboot();
  2027. }
  2028. /* Подтверждение новых сетевых настроек */
  2029. else if (strncmp(receiveBuf, "GET /confirm.cgi", 16) == 0)
  2030. {
  2031. SetWebReinitFlag(false);
  2032. SetConfirmWebParamsFlag();
  2033. fs_open("/index.html", &file);
  2034. *sendLen = file.len;
  2035. return file.data;
  2036. }
  2037. /* Проверка пароля, переход в bootloader */
  2038. else if (strncmp(receiveBuf, "GET /fw_update.cgi", 18) == 0)
  2039. {
  2040. HTTP_ConfirmBootPwd(receiveBuf, sendBuf, receivedBufLen, sendLen);
  2041. return sendBuf;
  2042. }
  2043. /* Смена пароля пользователя */
  2044. else if (strncmp(receiveBuf, "GET /changepwd.cgi", 18) == 0)
  2045. {
  2046. HTTP_ChangeUserPwd(receiveBuf, sendBuf, receivedBufLen, sendLen);
  2047. return sendBuf;
  2048. }
  2049. // На производстве
  2050. else if (strncmp(receiveBuf, "GET /setProdate.cgi", 19) == 0)
  2051. {
  2052. HTTP_Prodate(receiveBuf, sendBuf, receivedBufLen, sendLen);
  2053. return sendBuf;
  2054. }
  2055. /* Check common GET request */
  2056. else if (strncmp(receiveBuf, "GET", 3) == 0) {
  2057. char filename[MAX_FILENAME_LEN];
  2058. char nonmatch[MAX_ETAG_LEN];
  2059. char *pnonmatch = NULL;
  2060. uint8_t len;
  2061. if (GetFileName(receiveBuf, filename, &len)) {
  2062. HTTP_UpdateUserLoginTime(user_id);
  2063. /* Parce If-Non_Match value */
  2064. uint8_t nonmatch_len = Parse_Header(receiveBuf, receivedBufLen, If_None_Match, 15, nonmatch);
  2065. if (nonmatch_len < MAX_ETAG_LEN && nonmatch_len > 0) {
  2066. DBG printf("If_None_Match: %s\r\n", nonmatch);
  2067. pnonmatch = nonmatch;
  2068. }
  2069. return send_file(filename, pnonmatch, &file, sendLen);
  2070. }
  2071. }
  2072. else
  2073. {
  2074. HTTP_UpdateUserLoginTime(user_id);
  2075. fs_open("/index.html", &file); // +
  2076. *sendLen = file.len;
  2077. return file.data;
  2078. }
  2079. return 0;
  2080. }
  2081. #define FRAME_SIZE (1000)
  2082. SSL_SERVER_STATE SSL_SendFrames(mbedtls_ssl_context *ssl, char *data, int datalen)
  2083. {
  2084. SSL_SERVER_STATE ret;
  2085. int retClose;
  2086. int index = 0;
  2087. int k = 0;
  2088. int lastframe, nbrframes;
  2089. nbrframes = datalen / FRAME_SIZE;
  2090. while(nbrframes > 0)
  2091. {
  2092. index = k * FRAME_SIZE;
  2093. if (SSL_Write(ssl, (data + index), FRAME_SIZE ) == SSL_WRITE_ERROR)
  2094. return SSL_WRITE_ERROR;
  2095. nbrframes--;
  2096. k++;
  2097. }
  2098. index = k * FRAME_SIZE;
  2099. lastframe = datalen % FRAME_SIZE ;
  2100. if (SSL_Write(ssl, (data + index), lastframe ) == SSL_WRITE_ERROR)
  2101. return SSL_WRITE_ERROR;
  2102. return SSL_WRITE_OK;
  2103. }
  2104. SSL_SERVER_STATE SSL_Write(mbedtls_ssl_context *ssl, char *data, int datalen)
  2105. {
  2106. int ret;
  2107. mbedtls_printf( " > Write to client:" );
  2108. while( ( ret = mbedtls_ssl_write(ssl, data, datalen) ) <= 0 )
  2109. {
  2110. if( ret == MBEDTLS_ERR_NET_CONN_RESET )
  2111. {
  2112. mbedtls_printf( " failed\r\n ! peer closed the connection\r\n" );
  2113. return SSL_WRITE_ERROR;
  2114. }
  2115. if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
  2116. {
  2117. mbedtls_printf( " failed\r\n ! mbedtls_ssl_write returned %d\r\n", ret );
  2118. return SSL_WRITE_ERROR;
  2119. }
  2120. }
  2121. mbedtls_printf( " %d bytes written\r\n", ret);
  2122. return SSL_WRITE_OK;
  2123. }
  2124. /**
  2125. * @brief Send callback for log file transfer (messages as is, not ordered)
  2126. */
  2127. void HTTP_SendHistory(void)
  2128. {
  2129. uint32_t nbytes = 0;
  2130. static bool start = true;
  2131. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  2132. if (log_ptr + FILE_BUF_MAX_LEN <= log_size) {
  2133. nbytes = History_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN, start);
  2134. }
  2135. else if (log_ptr < log_size) {
  2136. nbytes = History_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  2137. }
  2138. else {
  2139. nbytes = 0;
  2140. }
  2141. log_ptr += nbytes;
  2142. start = false;
  2143. if (nbytes == 0) {
  2144. // File transfer finished.
  2145. start = true;
  2146. // Clear file transfer in progress flag
  2147. fLogTransInprog = false;
  2148. return;
  2149. }
  2150. SSL_SendFrames(&ssl, logFileBuf, nbytes);
  2151. HTTP_SendHistory();
  2152. }
  2153. /**
  2154. * @brief Sent callback for log file transfer (messages as is, not ordered)
  2155. */
  2156. void HTTP_SendLog(void)
  2157. {
  2158. uint32_t nbytes = 0;
  2159. static bool start = true;
  2160. memset(logFileBuf, 0, FILE_BUF_MAX_LEN);
  2161. if (log_ptr + FILE_BUF_MAX_LEN_LOG <= log_size) {
  2162. nbytes = LOG_GetData(log_ptr, logFileBuf, FILE_BUF_MAX_LEN_LOG, start);
  2163. }
  2164. else if (log_ptr < log_size) {
  2165. nbytes = LOG_GetData(log_ptr, logFileBuf, (log_size - log_ptr), start);
  2166. }
  2167. else {
  2168. nbytes = 0;
  2169. }
  2170. log_ptr += nbytes;
  2171. start = false;
  2172. if (nbytes == 0) {
  2173. // File transfer finished.
  2174. start = true;
  2175. // Clear file transfer in progress flag
  2176. fLogTransInprog = false;
  2177. return;
  2178. }
  2179. SSL_SendFrames(&ssl, logFileBuf, nbytes);
  2180. HTTP_SendLog();
  2181. return;
  2182. }
  2183. /**
  2184. * @brief sends file from flash FS
  2185. * @param filename: pointer to the file name to send
  2186. * @param pnonmatch: pointer to the If-Non_Match value
  2187. * @param pcb: pointer to a tcp_pcb struct
  2188. * @param hs: pointer to a http_state struct
  2189. * @param file: pointer to a fs_file struct
  2190. * @retval
  2191. */
  2192. char* send_file(char *filename, char *pnonmatch, struct fs_file *file, uint16_t *Len)
  2193. {
  2194. int res = 0;
  2195. char etag[MAX_ETAG_LEN];
  2196. char *petag = NULL;
  2197. res = fs_open(filename, file);
  2198. if (res == 0) {
  2199. printf("Not found: %s\r\n", filename);
  2200. sprintf(filename, "/index.html");
  2201. fs_open(filename, file);
  2202. }
  2203. /* Find Etag value */
  2204. uint8_t etag_len = Parse_Header(file->data, file->len, Etag, 6, etag);
  2205. if (etag_len < MAX_ETAG_LEN && etag_len > 0) {
  2206. DBG printf("Etag: %s\r\n", etag);
  2207. petag = etag;
  2208. }
  2209. /* Compare Etag and If-Non-Match fields */
  2210. if (pnonmatch && petag && (strcmp(pnonmatch, petag) == 0)) {
  2211. /* Send 304 code */
  2212. sprintf(sendBuf, HTTP_304_NOT_MODIFIED);
  2213. DBG printf(sendBuf);
  2214. *Len = strlen(sendBuf);
  2215. return sendBuf;
  2216. //hs->file = sendBuf;
  2217. //hs->left = strlen(sendBuf);
  2218. }
  2219. else {
  2220. /* Send file */
  2221. //DBG printf("%s\r\n\r\n", filename);
  2222. //hs->file = file->data;
  2223. //hs->left = file->len;
  2224. *Len = file->len;
  2225. return file->data;
  2226. }
  2227. //send_data(pcb, hs);
  2228. //tcp_sent(pcb, http_sent);
  2229. }
  2230. /**
  2231. * @brief Extract the custom field data from HTML data
  2232. * @param data : pointer on receive packet buffer
  2233. * @param len : buffer length
  2234. * @param field : field name
  2235. * @param flen : field name length
  2236. * @retval value : pointer for field data
  2237. */
  2238. static uint32_t Parse_Header(char *data, uint32_t len, const char *field, uint32_t flen, char *value)
  2239. {
  2240. uint32_t i = 0, size = 0;
  2241. char *ptr;
  2242. uint32_t Offset = 0;
  2243. /* Find field name in data buffer */
  2244. for (i = 0; i < len; i++) {
  2245. if (strncmp ((char*)(data + i), field, flen) == 0) {
  2246. Offset = i + flen;
  2247. break;
  2248. }
  2249. }
  2250. /* Copy Field value */
  2251. if (Offset) {
  2252. i = 0;
  2253. ptr = (char*)(data + Offset);
  2254. while (*(ptr + i) != 0x0d) {
  2255. value[i] = *(ptr + i);
  2256. i++;
  2257. }
  2258. value[i] = '\0';
  2259. size = i;
  2260. }
  2261. return size;
  2262. }
  2263. /**
  2264. * @brief
  2265. * @retval None
  2266. */
  2267. bool GetFileName(char *inStr, char *fileName, uint8_t *fileNameLen)
  2268. {
  2269. char *beginValue = NULL;
  2270. char *endValue = NULL;
  2271. int len = 0;
  2272. char *strPtr = NULL;
  2273. strPtr = strstr(inStr, "GET");
  2274. if (strPtr == NULL) {
  2275. strPtr = strstr(inStr, "POST");
  2276. }
  2277. if (strPtr == NULL) {
  2278. *fileNameLen = 0;
  2279. return false;
  2280. }
  2281. else {
  2282. beginValue = strpbrk(strPtr, "/");
  2283. endValue = strpbrk(beginValue, " ");
  2284. if (endValue == NULL) {
  2285. *fileNameLen = 0;
  2286. return false;
  2287. }
  2288. len = endValue - beginValue;
  2289. if (len < MAX_FILENAME_LEN) {
  2290. strncpy(fileName, beginValue, len);
  2291. *fileNameLen = len;
  2292. fileName[len] = '\0';
  2293. return true;
  2294. }
  2295. else {
  2296. return false;
  2297. }
  2298. }
  2299. }
  2300. #endif