2025-04-27 07:49:33 -04:00

206 lines
6.7 KiB
C++

// PPTESTEXT.CPP - Implementation file for your Internet Server
// PPTestExt Extension
#include "stdafx.h"
#include <comdef.h>
#include <httpext.h>
#include "passport.h"
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO* pVer)
{
// Create the extension version string, and
// copy string to HSE_VERSION_INFO structure.
pVer->dwExtensionVersion =
MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);
// Copy description string into HSE_VERSION_INFO structure.
lstrcpyA(pVer->lpszExtensionDesc, "Passport Test Extension");
return TRUE;
}
BOOL WINAPI TerminateExtension(DWORD dwFlags)
{
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// CPPTestExtExtension command handlers
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK* pECB)
{
HRESULT hr;
DWORD dwRet;
IPassportManager* piPM = NULL;
VARIANT_BOOL bAuthenticated;
CHAR achCookieBuf[4096];
CHAR achUrlBuf[4096];
CHAR achStatus[32];
DWORD dwBufLen;
_bstr_t bstrReturnURL;
BSTR bstrAuthURL;
VARIANT vtTimeWindow;
VARIANT vtForceSignin;
VARIANT vtReturnURL;
VARIANT vtNoParam;
VARIANT_BOOL bFromNetworkServer;
HSE_SEND_HEADER_EX_INFO hseSendHeaderExInfo;
VariantInit(&vtNoParam);
vtNoParam.vt = VT_ERROR;
vtNoParam.scode = DISP_E_PARAMNOTFOUND;
hr = CoCreateInstance(CLSID_Manager, NULL, CLSCTX_INPROC_SERVER, IID_IPassportManager, (void**)&piPM);
if(hr != S_OK)
{
dwRet = HSE_STATUS_ERROR;
goto Cleanup;
}
dwBufLen = sizeof(achCookieBuf);
hr = piPM->OnStartPageECB((LPBYTE)pECB, &dwBufLen, achCookieBuf);
if(hr != S_OK)
{
dwRet = HSE_STATUS_ERROR;
goto Cleanup;
}
VariantInit(&vtTimeWindow);
vtTimeWindow.vt = VT_I4;
vtTimeWindow.lVal = 1000000;
VariantInit(&vtForceSignin);
vtForceSignin.vt = VT_BOOL;
vtForceSignin.boolVal = VARIANT_FALSE;
hr = piPM->IsAuthenticated(vtTimeWindow, vtForceSignin, vtNoParam, &bAuthenticated);
if(hr != S_OK)
{
dwRet = HSE_STATUS_ERROR;
goto Cleanup;
}
if(!bAuthenticated)
{
lstrcpyA(achUrlBuf, "http://");
dwBufLen = sizeof(achUrlBuf) - sizeof("http://");
pECB->GetServerVariable(pECB->ConnID,
"SERVER_NAME",
&(achUrlBuf[lstrlenA(achUrlBuf)]),
&dwBufLen);
dwBufLen = sizeof(achUrlBuf) - lstrlenA(achUrlBuf);
pECB->GetServerVariable(pECB->ConnID,
"SCRIPT_NAME",
&(achUrlBuf[lstrlenA(achUrlBuf)]),
&dwBufLen);
bstrReturnURL = achUrlBuf;
// Get the URL for the login page.
VariantInit(&vtReturnURL);
vtReturnURL.vt = VT_BSTR;
vtReturnURL.bstrVal = bstrReturnURL;
hr = piPM->AuthURL(vtReturnURL,
vtTimeWindow,
vtForceSignin,
vtNoParam,
vtNoParam,
vtNoParam,
vtNoParam,
vtNoParam,
&bstrAuthURL);
// Redirect to login page.
dwBufLen = SysStringLen(bstrAuthURL);
pECB->ServerSupportFunction(pECB->ConnID,
HSE_REQ_SEND_URL_REDIRECT_RESP,
(char*)_bstr_t(bstrAuthURL),
&dwBufLen,
NULL);
}
else
{
piPM->get_FromNetworkServer(&bFromNetworkServer);
if(bFromNetworkServer)
{
lstrcpyA(achUrlBuf, "http://");
dwBufLen = sizeof(achUrlBuf) - sizeof("http://");
pECB->GetServerVariable(pECB->ConnID,
"SERVER_NAME",
&(achUrlBuf[lstrlenA(achUrlBuf)]),
&dwBufLen);
dwBufLen = sizeof(achUrlBuf) - lstrlenA(achUrlBuf);
pECB->GetServerVariable(pECB->ConnID,
"SCRIPT_NAME",
&(achUrlBuf[lstrlenA(achUrlBuf)]),
&dwBufLen);
lstrcpyA(achStatus, "302 Moved");
lstrcatA(achCookieBuf, "Location: ");
lstrcatA(achCookieBuf, achUrlBuf);
lstrcatA(achCookieBuf, "\r\n\r\n");
hseSendHeaderExInfo.pszStatus = achStatus;
hseSendHeaderExInfo.pszHeader = achCookieBuf;
hseSendHeaderExInfo.cchStatus = lstrlenA(achStatus);
hseSendHeaderExInfo.cchHeader = lstrlenA(achCookieBuf);
hseSendHeaderExInfo.fKeepConn = TRUE;
}
else
{
char achNumBuf[16];
#define RESPONSE_BODY "<html><head><title>Test ISAPI Ext.</title></head><body>You're auth'ed!</body></html>"
lstrcpyA(achStatus, "200 OK");
lstrcatA(achCookieBuf, "Content-Type: text/html\r\nContent-Length: ");
_itoa(sizeof(RESPONSE_BODY), achNumBuf, 10);
lstrcatA(achCookieBuf, achNumBuf);
lstrcatA(achCookieBuf, "\r\n\r\n");
hseSendHeaderExInfo.pszStatus = achStatus;
hseSendHeaderExInfo.pszHeader = achCookieBuf;
hseSendHeaderExInfo.cchStatus = lstrlenA(achStatus);
hseSendHeaderExInfo.cchHeader = lstrlenA(achCookieBuf);
hseSendHeaderExInfo.fKeepConn = TRUE;
}
pECB->ServerSupportFunction(pECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER_EX,
&hseSendHeaderExInfo,
NULL,
NULL);
dwBufLen = sizeof(RESPONSE_BODY);
pECB->WriteClient(pECB->ConnID,
RESPONSE_BODY,
&dwBufLen,
HSE_IO_SYNC);
}
dwRet = HSE_STATUS_SUCCESS;
Cleanup:
VariantClear(&vtTimeWindow);
VariantClear(&vtForceSignin);
VariantClear(&vtReturnURL);
VariantClear(&vtNoParam);
if(piPM)
piPM->Release();
return dwRet;
}