|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: linkutil.cpp
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include <dbgdef.h>
extern HINSTANCE HinstDll;
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
void CryptuiGoLink(HWND hwndParent, char *pszWhere, BOOL fNoCOM) { HCURSOR hcursPrev = NULL; HMODULE hURLMon = NULL; BOOL fCallCoUnInit = FALSE; //
// since we're a model dialog box, we want to go behind IE once it comes up!!!
//
SetWindowPos(hwndParent, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
hcursPrev = SetCursor(LoadCursor(NULL, IDC_WAIT));
__try {
hURLMon = (HMODULE)LoadLibraryU(L"urlmon.dll");
if (!(hURLMon) || fNoCOM) { //
// The hyperlink module is unavailable, go to fallback plan
//
//
// This works in test cases, but causes deadlock problems when used from withing
// the Internet Explorer itself. The dialog box is up (that is, IE is in a modal
// dialog loop) and in comes this DDE request...).
//
ShellExecute(hwndParent, "open", pszWhere, NULL, NULL, SW_SHOWNORMAL); } else { //
// The hyperlink module is there. Use it
//
if (SUCCEEDED(CoInitialize(NULL))) // Init OLE if no one else has
{ fCallCoUnInit = TRUE;
//
// allow com to fully init...
//
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); // peek but not remove
typedef void (WINAPI *pfnHlinkSimpleNavigateToString)(LPCWSTR, LPCWSTR, LPCWSTR, IUnknown *, IBindCtx *, IBindStatusCallback *, DWORD, DWORD);
pfnHlinkSimpleNavigateToString pProcAddr;
pProcAddr = (pfnHlinkSimpleNavigateToString)GetProcAddress(hURLMon, TEXT("HlinkSimpleNavigateToString"));
if (pProcAddr) { WCHAR *pwszWhere; IBindCtx *pbc;
pwszWhere = new WCHAR[strlen(pszWhere) + 1]; if (pwszWhere == NULL) { return; }
MultiByteToWideChar(0, 0, (const char *)pszWhere, -1, pwszWhere, strlen(pszWhere) + 1);
pbc = NULL;
CreateBindCtx( 0, &pbc ); (*pProcAddr)(pwszWhere, NULL, NULL, NULL, pbc, NULL, HLNF_OPENINNEWWINDOW, NULL);
if (pbc) { pbc->Release(); }
delete [] pwszWhere; } CoUninitialize(); }
FreeLibrary(hURLMon); }
SetCursor(hcursPrev); } __except(EXCEPTION_EXECUTE_HANDLER) { if (hURLMon != NULL) { FreeLibrary(hURLMon); }
if (fCallCoUnInit) { CoUninitialize(); }
if (hcursPrev != NULL) { SetCursor(hcursPrev); } } }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL AllocAndGetIssuerURL(LPSTR *ppURLString, PCCERT_CONTEXT pCertContext) { PCERT_EXTENSION pExt = NULL; PSPC_SP_AGENCY_INFO pInfo = NULL; DWORD cbInfo = 0; PCERT_ALT_NAME_ENTRY pAltName = NULL; DWORD cbAltName = 0;
*ppURLString = NULL;
//
// first look for the Agency Info extension and see if it has an URL
//
if ((pExt = CertFindExtension(SPC_SP_AGENCY_INFO_OBJID, pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->rgExtension))) { CryptDecodeObject(X509_ASN_ENCODING, SPC_SP_AGENCY_INFO_STRUCT, pExt->Value.pbData, pExt->Value.cbData, 0, NULL, &cbInfo);
if (!(pInfo = (PSPC_SP_AGENCY_INFO) malloc(cbInfo))) { return FALSE; }
if (!(CryptDecodeObject(X509_ASN_ENCODING, SPC_SP_AGENCY_INFO_STRUCT, pExt->Value.pbData, pExt->Value.cbData, 0, pInfo, &cbInfo))) { free(pInfo); return FALSE; }
if (!(pInfo->pPolicyInformation)) { free(pInfo); return FALSE; }
switch (pInfo->pPolicyInformation->dwLinkChoice) { case SPC_URL_LINK_CHOICE: if (NULL != (*ppURLString = (LPSTR) malloc(wcslen(pInfo->pPolicyInformation->pwszUrl)+1))) { WideCharToMultiByte( 0, 0, pInfo->pPolicyInformation->pwszUrl, -1, *ppURLString, wcslen(pInfo->pPolicyInformation->pwszUrl)+1, NULL, NULL); free(pInfo); return TRUE; } else { free(pInfo); return FALSE; } break; case SPC_FILE_LINK_CHOICE: if (NULL != (*ppURLString = (LPSTR) malloc(wcslen(pInfo->pPolicyInformation->pwszFile)+1))) { WideCharToMultiByte( 0, 0, pInfo->pPolicyInformation->pwszFile, -1, *ppURLString, wcslen(pInfo->pPolicyInformation->pwszFile)+1, NULL, NULL);
return TRUE; } else { free(pInfo); return FALSE; } break; } free(pInfo); }
//
// if there was no Agency Info extension or it didn't contain an URL,
// look for the Authority Info Access Syntax extension
//
/*if ((pExt = CertFindExtension(SPC_SP_AGENCY_INFO_OBJID, pCertContext->pCertInfo->cExtension,
pCertContext->pCertInfo->rgExtension))) { FIX FIX }*/
//
// finally, if there was no Agency Info and no Authority Info Access Syntax
// check to see if there is an Alternate Name extension
//
if ((pExt = CertFindExtension(szOID_ISSUER_ALT_NAME, pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->rgExtension))) { CryptDecodeObject(X509_ASN_ENCODING, szOID_ISSUER_ALT_NAME, pExt->Value.pbData, pExt->Value.cbData, 0, NULL, &cbAltName);
if (!(pAltName = (PCERT_ALT_NAME_ENTRY) malloc(cbAltName))) { return FALSE; }
if (!(CryptDecodeObject(X509_ASN_ENCODING, szOID_ISSUER_ALT_NAME, pExt->Value.pbData, pExt->Value.cbData, 0, pAltName, &cbAltName))) { free(pAltName); return FALSE; } if (pAltName->dwAltNameChoice == CERT_ALT_NAME_URL) { if (NULL != (*ppURLString = (LPSTR) malloc(wcslen(pAltName->pwszURL)+1))) { WideCharToMultiByte( 0, 0, pAltName->pwszURL, -1, *ppURLString, wcslen(pAltName->pwszURL)+1, NULL, NULL);
free(pAltName); return TRUE; } } free(pAltName); }
return FALSE; }
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL AllocAndGetSubjectURL(LPSTR *ppURLString, PCCERT_CONTEXT pCertContext) { PCERT_EXTENSION pExt = NULL; PCERT_ALT_NAME_ENTRY pAltName = NULL; DWORD cbAltName = 0; *ppURLString = NULL; //
// check to see if there is an Alternate Name extension
//
if ((pExt = CertFindExtension(szOID_SUBJECT_ALT_NAME, pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->rgExtension))) { CryptDecodeObject(X509_ASN_ENCODING, szOID_SUBJECT_ALT_NAME, pExt->Value.pbData, pExt->Value.cbData, 0, NULL, &cbAltName);
if (!(pAltName = (PCERT_ALT_NAME_ENTRY) malloc(cbAltName))) { return FALSE; }
if (!(CryptDecodeObject(X509_ASN_ENCODING, szOID_SUBJECT_ALT_NAME, pExt->Value.pbData, pExt->Value.cbData, 0, pAltName, &cbAltName))) { free(pAltName); return FALSE; } if (pAltName->dwAltNameChoice == CERT_ALT_NAME_URL) { if (NULL != (*ppURLString = (LPSTR) malloc(wcslen(pAltName->pwszURL)+1))) { WideCharToMultiByte( 0, 0, pAltName->pwszURL, -1, *ppURLString, wcslen(pAltName->pwszURL)+1, NULL, NULL);
free(pAltName); return TRUE; } } free(pAltName); }
return FALSE; }
|