| #include "wsIntrn.h" |
| #include "../interface5.0/zte_web_interface.h" |
| //#include "../interface5.0/zte_rest_comm_interface.h" |
| |
| |
| |
| static websUrlHandlerType *websUrlHandler; |
| static int websUrlHandlerMax; |
| static int urlHandlerOpenCount = 0; |
| |
| static int websUrlHandlerSort(const void *p1, const void *p2); |
| static char_t *websCondenseMultipleChars(char_t *strToCondense, char_t cCondense); |
| |
| static int websPublishHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, |
| int sid, char_t *url, char_t *path, char_t *query); |
| |
| |
| |
| static int websUrlHandlerSort(const void *p1, const void *p2) |
| { |
| websUrlHandlerType *s1, *s2; |
| int rc; |
| |
| a_assert(p1); |
| a_assert(p2); |
| |
| s1 = (websUrlHandlerType*) p1; |
| s2 = (websUrlHandlerType*) p2; |
| |
| if ((s1->flags & WEBS_HANDLER_FIRST) || (s2->flags & WEBS_HANDLER_LAST)) { |
| return -1; |
| } |
| |
| if ((s2->flags & WEBS_HANDLER_FIRST) || (s1->flags & WEBS_HANDLER_LAST)) { |
| return 1; |
| } |
| |
| if ((rc = gstrcmp(s1->urlPrefix, s2->urlPrefix)) == 0) { |
| if (s1->len < s2->len) { |
| return 1; |
| } else if (s1->len > s2->len) { |
| return -1; |
| } |
| } |
| return -rc; |
| } |
| |
| int websUrlHandlerOpen() |
| { |
| if (++urlHandlerOpenCount == 1) { |
| #ifdef WEB_ASP |
| websAspOpen(); |
| #endif |
| websUrlHandler = NULL; |
| websUrlHandlerMax = 0; |
| } |
| return 0; |
| } |
| |
| int websUrlHandlerDefine(char_t *urlPrefix, char_t *webDir, int arg, |
| int (*handler)(webs_t wp, char_t *urlPrefix, char_t *webdir, int arg, |
| char_t *url, char_t *path, char_t *query), int flags) |
| { |
| websUrlHandlerType *sp; |
| int len; |
| |
| a_assert(urlPrefix); |
| a_assert(handler); |
| |
| len = (websUrlHandlerMax + 1) * sizeof(websUrlHandlerType); |
| if ((websUrlHandler = brealloc(B_L, websUrlHandler, len)) == NULL) { |
| return -1; |
| } |
| sp = &websUrlHandler[websUrlHandlerMax++]; |
| memset(sp, 0, sizeof(websUrlHandlerType)); |
| |
| sp->urlPrefix = bstrdup(B_L, urlPrefix); |
| if(sp->urlPrefix) |
| sp->len = gstrlen(sp->urlPrefix); |
| if (webDir) { |
| sp->webDir = bstrdup(B_L, webDir); |
| } else { |
| sp->webDir = bstrdup(B_L, T("")); |
| } |
| sp->handler = handler; |
| sp->arg = arg; |
| sp->flags = flags; |
| |
| qsort(websUrlHandler, websUrlHandlerMax, sizeof(websUrlHandlerType), |
| websUrlHandlerSort); |
| return 0; |
| } |
| |
| void websUrlHandlerClose() |
| { |
| websUrlHandlerType *sp; |
| |
| if (--urlHandlerOpenCount <= 0) { |
| #ifdef WEB_ASP |
| websAspClose(); |
| #endif |
| for (sp = websUrlHandler; sp < &websUrlHandler[websUrlHandlerMax]; |
| sp++) { |
| bfree(B_L, sp->urlPrefix); |
| if (sp->webDir) { |
| bfree(B_L, sp->webDir); |
| } |
| } |
| bfree(B_L, websUrlHandler); |
| websUrlHandlerMax = 0; |
| } |
| } |
| |
| int websPublish(char_t *urlPrefix, char_t *path) |
| { |
| return websUrlHandlerDefine(urlPrefix, path, 0, websPublishHandler, 0); |
| } |
| |
| |
| int websUrlHandlerDelete(int (*handler)(webs_t wp, char_t *urlPrefix, |
| char_t *webDir, int arg, char_t *url, char_t *path, char_t *query)) |
| { |
| websUrlHandlerType *sp; |
| int index; |
| |
| for (index = 0; index < websUrlHandlerMax; index++) { |
| sp = &websUrlHandler[index]; |
| if (sp->handler == handler) { |
| sp->handler = NULL; |
| return 0; |
| } |
| } |
| return -1; |
| } |
| |
| char_t *websGetPublishDir(char_t *path, char_t **urlPrefix) |
| { |
| websUrlHandlerType *sp; |
| int index; |
| |
| for (index = 0; index < websUrlHandlerMax; index++) { |
| sp = &websUrlHandler[index]; |
| if (sp->urlPrefix[0] == '\0') { |
| continue; |
| } |
| if (sp->handler && gstrncmp(sp->urlPrefix, path, sp->len) == 0) { |
| if (urlPrefix) { |
| *urlPrefix = sp->urlPrefix; |
| } |
| return sp->webDir; |
| } |
| } |
| return NULL; |
| } |
| |
| |
| static int websPublishHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, |
| int sid, char_t *url, char_t *path, char_t *query) |
| { |
| int len; |
| |
| a_assert(websValid(wp)); |
| a_assert(path); |
| |
| len = gstrlen(urlPrefix) + 1; |
| websSetRequestPath(wp, webDir, &path[len]); |
| return 0; |
| } |
| |
| #ifdef OBSOLETE_CODE |
| static int websTidyUrl(webs_t wp) |
| { |
| char_t *parts[64]; |
| char_t *token, *url, *tidyurl; |
| int i, len, npart; |
| |
| a_assert(websValid(wp)); |
| |
| |
| url = bstrdup(B_L, wp->url); |
| websDecodeUrl(url, url, gstrlen(url)); |
| |
| len = npart = 0; |
| parts[0] = NULL; |
| token = gstrtok(url, T("/")); |
| |
| while (token != NULL) { |
| if (gstrcmp(token, T("..")) == 0) { |
| if (npart > 0) { |
| npart--; |
| } |
| |
| } else if (gstrcmp(token, T(".")) != 0) { |
| parts[npart] = token; |
| len += gstrlen(token) + 1; |
| npart++; |
| } |
| token = gstrtok(NULL, T("/")); |
| } |
| |
| if (npart || (gstrcmp(url, T("/")) == 0) || (url[0] == '\0')) { |
| tidyurl = balloc(B_L, (len + 2) * sizeof(char_t)); |
| *tidyurl = '\0'; |
| |
| for (i = 0; i < npart; i++) { |
| gstrcat(tidyurl, T("/")); |
| gstrcat(tidyurl, parts[i]); |
| } |
| |
| bfree(B_L, url); |
| |
| bfree(B_L, wp->url); |
| wp->url = tidyurl; |
| return 0; |
| } else { |
| bfree(B_L, url); |
| return -1; |
| } |
| } |
| #endif |
| |
| int websUrlHandlerRequest(webs_t wp) |
| { |
| websUrlHandlerType *sp; |
| int i, first; |
| int m=0; |
| int n=0; |
| int m_count=0; |
| int n_count=0; |
| |
| char zte_user_login_flag[10] = {0}; |
| char zte_web_global_flag[10] = {0}; // 1 means needn't LOGIN, 0 means need LOGIN |
| char_t *ip_address = NULL; |
| char dataCard[32] = {0}; |
| char userIpaddr[40] = {0}; |
| a_assert(websValid(wp)); |
| if(websValid(wp)== 0){ |
| softap_assert("websUrlHandlerRequest 1"); |
| } |
| |
| socketDeleteHandler(wp->sid); |
| wp->state = WEBS_PROCESSING; |
| websStats.handlerHits++; |
| |
| websSetRequestPath(wp, websGetDefaultDir(), NULL); |
| |
| |
| ip_address = websGetRequestIpaddr(wp); |
| #if 0 // kw 3 |
| if (NULL == ip_address) |
| { |
| slog(MISC_PRINT,SLOG_ERR,"ip_address is null."); |
| websDone(wp, 200); |
| return 0; |
| } |
| #endif |
| |
| sc_cfg_get(NV_DATA_CARD,dataCard,sizeof(dataCard)); |
| sc_cfg_get(NV_USER_IP_ADDR,userIpaddr,sizeof(userIpaddr)); |
| if (0 == strcmp(dataCard,"1")) |
| { |
| strcpy(zte_user_login_flag,"ok"); |
| } |
| else if(0 == strcmp(userIpaddr,ip_address)) |
| { |
| sc_cfg_get("loginfo",zte_user_login_flag,sizeof(zte_user_login_flag)); |
| } |
| else |
| { |
| strcpy(zte_user_login_flag,""); |
| } |
| if(strstr(wp->url, "messages")) |
| { |
| if(strcmp("ok", zte_user_login_flag) != 0) |
| { |
| slog(MISC_PRINT,SLOG_DEBUG,"websUrlHandlerRequest -> GET is not allowed: %s", wp->url); |
| |
| //zte_webs_feedback_top(wp, zte_web_get_login_page(wp)); /*×ÔÊÊÓ¦ÖÕ¶Ëä¯ÀÀÆ÷*/ |
| //websDone(wp, 200); |
| websRedirect(wp, zte_web_get_login_page(wp)); |
| return 0; |
| } |
| // allow pass |
| } |
| |
| if (strstr(wp->url, "default_parameter") ||strstr(wp->url, "version_parameter") ||strstr(wp->url, "custom_parameter") ||strstr(wp->url, "zteconfig/config")) |
| { |
| slog(MISC_PRINT,SLOG_DEBUG,"websUrlHandlerRequest -> GET is not allowed: %s", wp->url); |
| websError(wp, 404, T("Bad state")); |
| return 0; |
| } |
| |
| //zte_nv_read("loginfo", zte_user_login_flag, sizeof(zte_user_login_flag)); |
| |
| if (strcmp("ok", zte_user_login_flag) != 0) // not login |
| { |
| // allow pass |
| |
| } |
| |
| #ifdef FEATURE_ZTE_WEB_TCARD |
| //added by guo shoupeng 10124224 for http share 20111001 start |
| zte_httpShare_urlHandler(wp,wp->url); |
| //added by guo shoupeng 10124224 for http share 20111001 start |
| #endif //def FEATURE_ZTE_WEB_TCARD |
| |
| /* |
| * Eliminate security hole |
| */ |
| websCondenseMultipleChars(wp->path, '/'); |
| websCondenseMultipleChars(wp->url, '/'); |
| |
| first = 1; |
| for (i = 0; i < websUrlHandlerMax; i++) |
| { |
| sp = &websUrlHandler[i]; |
| if (sp->handler && gstrncmp(sp->urlPrefix, wp->path, sp->len) == 0) |
| { |
| if (first) |
| { |
| websSetEnv(wp); |
| first = 0; |
| } |
| |
| if(websValid(wp)== 0){ |
| softap_assert("websUrlHandlerRequest 2"); |
| } |
| |
| if ((*sp->handler)(wp, sp->urlPrefix, sp->webDir, sp->arg, |
| wp->url, wp->path, wp->query)) |
| { |
| return 1; |
| } |
| if (!websValid(wp)) |
| { |
| trace(0, T("webs: handler %s called websDone, but didn't return 1\n"), sp->urlPrefix); |
| return 1; |
| } |
| } |
| } |
| |
| if (i >= websUrlHandlerMax) |
| { |
| websError(wp, 200, T("No handler for this URL")); |
| } |
| return 0; |
| } |
| |
| static char_t *websCondenseMultipleChars(char_t *strToCondense, char_t cCondense) |
| { |
| if (strToCondense != NULL) { |
| char_t *pStr, *pScan; |
| |
| pStr = pScan = strToCondense; |
| |
| while (*pScan && *pStr) { |
| |
| while ((*pScan == cCondense) && (*(pScan + 1) == cCondense)) { |
| pScan++; |
| } |
| |
| if (pStr != pScan) { |
| *pStr = *pScan; |
| } |
| |
| pScan++; |
| pStr++; |
| } |
| |
| if (pStr != pScan) { |
| *pStr = 0; |
| } |
| } |
| |
| return strToCondense; |
| } |
| |