Example #1
0
/*******************************************************************
 *	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;

}
Example #2
0
/*******************************************************************
 *	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;
}