/******************************************************************* * stat cache for file * * return: * slot # of cache file * -1 if file not in cache *******************************************************************/ int CacheState(char *filename, SKIN_FILE *sf) { register int i; unsigned int key = hash_string(filename); if(GetFileMimeType(filename) < 2) /* html */ { for(i=0; i<NUM_CACHE_HTML && html_shm[i].key; i++) if(html_shm[i].key == key /* match hash key */ && !strcmp(filename, html_shm[i].file.filename)) /* match filename for safety */ { if(sf) memcpy(sf, &(html_shm[i].file), SF_SIZE); return i; } } else { for(i=0; i<NUM_CACHE_FILE && file_shm[i].key; i++) if(file_shm[i].key == key && !strcmp(filename, file_shm[i].file.filename)) { if(sf) memcpy(sf, &(file_shm[i].file), SF_SIZE); return i; } } return -1; }
/******************************************************************* * Get (skin) file info * * get file size, modify time * determine MIME type & file exipre * * return: none *******************************************************************/ BOOL GetFileInfo(SKIN_FILE *sf) { struct stat fstat; #if 0 fprintf(fp_out, "[fname=%s]", sf->filename); fflush(fp_out); #endif if(stat(sf->filename, &fstat)==0) { sf->mime_type = GetFileMimeType(sf->filename); sf->size = fstat.st_size; sf->mtime = fstat.st_mtime; } else return FALSE; SetExpire(sf); return TRUE; }
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % H t t p E x t e n s i o n P r o c % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % HttpExtensionProc - ISAPI / Win32 API method. This method is % required by IIS. It is called once per client request. This % is where the extension accomplishes its purpose in life. See % Microsofts ISAPI API documentation for all the gory details. % */ DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB) { char **argv, **argv_hw, *errmsg; int argc, argc_hw, i; unsigned int impersonating, status; CHAR *lpszQuery, *lpszHeader=NULL, *lpszTemp=NULL; BOOL Success=FALSE; DWORD dwTotalBytes=0, dwLen=0; impersonating=False; pECB->dwHttpStatusCode=0; // 0 Failure if (!stricmp(pECB->lpszMethod, "get")) { lpszQuery = pECB->lpszQueryString; dwTotalBytes = lstrlen(lpszQuery); Success=TRUE; } else if (!stricmp(pECB->lpszMethod, "post")) { if(pECB->cbTotalBytes > 0) { DWORD cbQuery; dwTotalBytes=pECB->cbTotalBytes; lpszTemp = (char*)LocalAlloc(LPTR, dwTotalBytes+1); if (!lpszTemp) return HSE_STATUS_ERROR; cbQuery = pECB->cbTotalBytes - pECB->cbAvailable; if (cbQuery > 0) { pECB->ReadClient(pECB->ConnID, (LPVOID) (lpszTemp + pECB->cbAvailable),&cbQuery); } strncpy(lpszTemp, pECB->lpbData, pECB->cbAvailable); lpszTemp[dwTotalBytes]='\0'; lpszQuery = lpszTemp; Success=TRUE; } } if (Success) { status=CGIToArgv(lpszQuery,&argc,&argv); if (status == True) { char szMimeType[MaxTextExtent], szPathTranslated[MaxTextExtent]; DWORD dwBuffSize; HSE_SEND_HEADER_EX_INFO HeaderExInfo; dwBuffSize = MaxTextExtent; szPathTranslated[0] = '\0'; if (pECB->GetServerVariable(pECB->ConnID, "PATH_TRANSLATED",szPathTranslated,&dwBuffSize)) { GetFileMimeType(szPathTranslated, szMimeType,MaxTextExtent); } else strcpy(szMimeType,"application/ocetet-stream"); for (argc_hw=1; argc_hw < argc; argc_hw++) { char *blob_data, szHeaders[MaxTextExtent]; size_t blob_length; Image *image; ImageInfo *image_info; int mode=0; argv_hw = &argv[argc_hw]; if (LocaleNCompare("-login",argv[argc_hw],8) == 0) { for (i=argc_hw; i < argc; i++) { if (LocaleNCompare("login-",argv[i],8) == 0) break; } #if defined(WIN32) if ((i-argc_hw)>3) { char *domain=argv_hw[1], *userid=argv_hw[2], *passwd=argv_hw[3]; HANDLE hToken; BOOL status; status = LogonUser(userid,domain,passwd, LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken); if (status) { status = ImpersonateLoggedOnUser(hToken); if (status) impersonating=True; else errmsg = NTGetLastError(); } else errmsg = NTGetLastError(); } #endif argc_hw = i+1; argv_hw = &argv[argc_hw]; } if (LocaleNCompare("-convert",argv[argc_hw],8) == 0) { for (i=argc_hw; i < argc; i++) { if (LocaleNCompare("-xbdat",argv[i],6) == 0) { argv[i+1]=(char *)(&blob_data); mode=1; } else if (LocaleNCompare("-xblen",argv[i],6) == 0) { argv[i+1]=(char *)(&blob_length); mode=1; } else if (LocaleNCompare("-xfunc",argv[i],6) == 0) { argv[i+1]=(char *)CGIFifo; mode=2; } else if (LocaleNCompare("-xctxt",argv[i],6) == 0) { argv[i+1]=(char *)pECB; mode=2; } else if (LocaleNCompare("-xinfo",argv[i],6) == 0) { argv[i+1]=(char *)(&image_info); mode=3; } else if (LocaleNCompare("-ximag",argv[i],6) == 0) { argv[i+1]=(char *)(&image); mode=3; } else if (LocaleNCompare("convert-",argv[i],8) == 0) break; } if (mode==0) { convert_main(i-argc_hw,argv_hw); } if (mode==1) { blob_length=8192; convert_main(i-argc_hw,argv_hw); dwLen=blob_length; sprintf(szHeaders, "Content-Length: %u\r\nContent-Type: %s\r\n\r\n", dwLen,szMimeType); HeaderExInfo.pszStatus = "200 OK"; HeaderExInfo.pszHeader = szHeaders; HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus ); HeaderExInfo.cchHeader = strlen( szHeaders ); HeaderExInfo.fKeepConn = FALSE; if (!pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER_EX,&HeaderExInfo,NULL,NULL)) return HSE_STATUS_ERROR; if (!pECB->WriteClient( pECB->ConnID, blob_data, &dwLen, 0)) return HSE_STATUS_ERROR; } if (mode==2) { sprintf(szHeaders,"Content-Type: %s\r\n\r\n",szMimeType); HeaderExInfo.pszStatus = "200 OK"; HeaderExInfo.pszHeader = szHeaders; HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus ); HeaderExInfo.cchHeader = strlen( szHeaders ); HeaderExInfo.fKeepConn = FALSE; if (!pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER_EX,&HeaderExInfo,NULL,NULL)) return HSE_STATUS_ERROR; convert_main(i-argc_hw,argv_hw); } if (mode==3) { convert_main(i-argc_hw,argv_hw); } argc_hw = i+1; argv_hw = &argv[argc_hw]; } if (LocaleNCompare("-combine",argv[argc_hw],8) == 0) { for (i=argc_hw; i < argc; i++) { if (LocaleNCompare("-xbdat",argv[i],6) == 0) { argv[i+1]=(char *)(&blob_data); mode=1; } else if (LocaleNCompare("-xblen",argv[i],6) == 0) { argv[i+1]=(char *)(&blob_length); mode=1; } else if (LocaleNCompare("-xfunc",argv[i],6) == 0) { argv[i+1]=(char *)CGIFifo; mode=2; } else if (LocaleNCompare("-xctxt",argv[i],6) == 0) { argv[i+1]=(char *)pECB; mode=2; } else if (LocaleNCompare("-xinfo",argv[i],6) == 0) { argv[i+1]=(char *)(&image_info); mode=3; } else if (LocaleNCompare("-ximag",argv[i],6) == 0) { argv[i+1]=(char *)(&image); mode=3; } else if (LocaleNCompare("combine-",argv[i],8) == 0) break; } if (mode==0) { combine_main(i-argc_hw,argv_hw); } if (mode==1) { blob_length=8192; combine_main(i-argc_hw,argv_hw); dwLen=blob_length; sprintf(szHeaders, "Content-Length: %u\r\nContent-Type: %s\r\n\r\n", dwLen,szMimeType); HeaderExInfo.pszStatus = "200 OK"; HeaderExInfo.pszHeader = szHeaders; HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus ); HeaderExInfo.cchHeader = strlen( szHeaders ); HeaderExInfo.fKeepConn = FALSE; if (!pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER_EX,&HeaderExInfo,NULL,NULL)) return HSE_STATUS_ERROR; if (!pECB->WriteClient( pECB->ConnID, blob_data, &dwLen, 0)) return HSE_STATUS_ERROR; } if (mode==2) { sprintf(szHeaders,"Content-Type: %s\r\n\r\n",szMimeType); HeaderExInfo.pszStatus = "200 OK"; HeaderExInfo.pszHeader = szHeaders; HeaderExInfo.cchStatus = strlen( HeaderExInfo.pszStatus ); HeaderExInfo.cchHeader = strlen( szHeaders ); HeaderExInfo.fKeepConn = FALSE; if (!pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER_EX,&HeaderExInfo,NULL,NULL)) return HSE_STATUS_ERROR; combine_main(i-argc_hw,argv_hw); } if (mode==3) { combine_main(i-argc_hw,argv_hw); } argc_hw = i+1; argv_hw = &argv[argc_hw]; } } } // BUG: must free all the strings pointed to by argv not just argv LiberateMemory((void **) &argv); } if (impersonating==True) { #if defined(WIN32) status = RevertToSelf(); if (status) impersonating=False; else errmsg = NTGetLastError(); #endif } pECB->dwHttpStatusCode=200; // 200 OK if (lpszTemp) LocalFree(lpszTemp); return HSE_STATUS_SUCCESS; }