|
|
//+--------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// File: forward.cpp
//
// Contents: Forward license request.
//
// History:
//
//---------------------------------------------------------------------------
#include "pch.cpp"
#include "globals.h"
#include "srvlist.h"
#include "forward.h"
#include "keypack.h"
#include "postjob.h"
//-----------------------------------------------------------------------
CopyRpcTLSRequestToRequest( TLSLICENSEREQUEST* lpRpcRequest , LICENSEREQUEST* lpRequest ) /*++
--*/ { lpRequest->cbEncryptedHwid = lpRpcRequest->cbEncryptedHwid; lpRequest->pbEncryptedHwid = lpRpcRequest->pbEncryptedHwid; lpRequest->dwLanguageID = lpRpcRequest->dwLanguageID; lpRequest->dwPlatformID = lpRpcRequest->dwPlatformID; lpRequest->pProductInfo->dwVersion = lpRpcRequest->ProductInfo.dwVersion; lpRequest->pProductInfo->cbCompanyName = lpRpcRequest->ProductInfo.cbCompanyName; lpRequest->pProductInfo->pbCompanyName = lpRpcRequest->ProductInfo.pbCompanyName; lpRequest->pProductInfo->cbProductID = lpRpcRequest->ProductInfo.cbProductID; lpRequest->pProductInfo->pbProductID = lpRpcRequest->ProductInfo.pbProductID; return ERROR_SUCCESS; }
//-----------------------------------------------------------------------
DWORD ForwardUpgradeLicenseRequest( IN LPTSTR pszServerSetupId, IN OUT DWORD *pdwSupportFlags, IN TLSLICENSEREQUEST* pRequest, IN CHALLENGE_CONTEXT ChallengeContext, IN DWORD cbChallengeResponse, IN PBYTE pbChallengeResponse, IN DWORD cbOldLicense, IN PBYTE pbOldLicense, OUT PDWORD pcbNewLicense, OUT PBYTE* ppbNewLicense, OUT PDWORD pdwErrCode ) /*++
--*/ { TLS_HANDLE hHandle = NULL; DWORD dwStatus; LICENSEREQUEST LicenseRequest;
BYTE pbEncryptedHwid[1024]; // encrypted HWID can't be more than 1024
TCHAR szCompanyName[LSERVER_MAX_STRING_SIZE+2]; TCHAR szProductId[LSERVER_MAX_STRING_SIZE+2]; Product_Info ProductInfo;
TLServerInfo ServerInfo;
DBGPrintf( DBG_INFORMATION, DBG_FACILITY_RPC, DBGLEVEL_FUNCTION_TRACE, _TEXT("ForwardUpgradeLicenseRequest() ...\n") );
dwStatus = TLSLookupRegisteredServer( pszServerSetupId, NULL, NULL, &ServerInfo );
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
if(TLSCanForwardRequest( TLS_CURRENT_VERSION, ServerInfo.GetServerVersion() ) == FALSE) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); goto cleanup; }
DBGPrintf( DBG_INFORMATION, DBG_FACILITY_RPC, DBGLEVEL_FUNCTION_TRACE, _TEXT("ForwardUpgradeLicenseRequest() to %s %s\n"), pszServerSetupId, ServerInfo.GetServerName() );
hHandle = TLSConnectToServerWithServerId(pszServerSetupId); if(hHandle == NULL) { //
// server not available
//
dwStatus = GetLastError(); goto cleanup; }
//
// RPC AC if pass in the original address
// TlsRequestToRequest(pTlsRequest, &LicenseRequest);
if(pRequest->cbEncryptedHwid >= sizeof(pbEncryptedHwid)) { TLSASSERT(FALSE); SetLastError(dwStatus = ERROR_INVALID_DATA); goto cleanup; }
if(pRequest->ProductInfo.cbCompanyName >= sizeof(szCompanyName) || pRequest->ProductInfo.cbProductID >= sizeof(szProductId) ) { TLSASSERT(FALSE); SetLastError(dwStatus = ERROR_INVALID_DATA); goto cleanup; }
memset(&LicenseRequest, 0, sizeof(LicenseRequest));
memcpy( pbEncryptedHwid, pRequest->pbEncryptedHwid, pRequest->cbEncryptedHwid );
LicenseRequest.pbEncryptedHwid = pbEncryptedHwid; LicenseRequest.cbEncryptedHwid = pRequest->cbEncryptedHwid; LicenseRequest.dwLanguageID = pRequest->dwLanguageID; LicenseRequest.dwPlatformID = pRequest->dwPlatformID; LicenseRequest.pProductInfo = &ProductInfo;
ProductInfo.dwVersion = pRequest->ProductInfo.dwVersion; ProductInfo.pbCompanyName = (PBYTE)szCompanyName; ProductInfo.pbProductID = (PBYTE)szProductId; ProductInfo.cbCompanyName = pRequest->ProductInfo.cbCompanyName; ProductInfo.cbProductID = pRequest->ProductInfo.cbProductID;
memset(szCompanyName, 0, sizeof(szCompanyName)); memset(szProductId, 0, sizeof(szProductId));
memcpy( szCompanyName, pRequest->ProductInfo.pbCompanyName, pRequest->ProductInfo.cbCompanyName );
memcpy( szProductId, pRequest->ProductInfo.pbProductID, pRequest->ProductInfo.cbProductID ); if(IsServiceShuttingdown() == TRUE) { dwStatus = TLS_I_SERVICE_STOP; } else { dwStatus = TLSUpgradeLicenseEx( hHandle, pdwSupportFlags, &LicenseRequest, ChallengeContext, cbChallengeResponse, pbChallengeResponse, cbOldLicense, pbOldLicense, 1, // dwQuantity
pcbNewLicense, ppbNewLicense, pdwErrCode ); }
cleanup:
if(hHandle) { TLSDisconnectFromServer(hHandle); }
return dwStatus; }
//-----------------------------------------------------------------------
DWORD ForwardNewLicenseRequest( IN LPTSTR pszServerSetupId, IN OUT DWORD *pdwSupportFlags, IN CHALLENGE_CONTEXT ChallengeContext, IN PTLSLICENSEREQUEST pRequest, IN LPTSTR pszMachineName, IN LPTSTR pszUserName, IN DWORD cbChallengeResponse, IN PBYTE pbChallengeResponse, IN BOOL bAcceptTemporaryLicense, IN BOOL bAcceptFewerLicenses, IN OUT DWORD *pdwQuantity, OUT PDWORD pcbLicense, OUT PBYTE *ppbLicense, IN OUT PDWORD pdwErrCode ) /*++
++*/ { TLS_HANDLE hHandle = NULL; DWORD dwStatus; LICENSEREQUEST LicenseRequest; BYTE pbEncryptedHwid[1024]; // encrypted HWID can't be more than 1024
TCHAR szCompanyName[LSERVER_MAX_STRING_SIZE+2]; TCHAR szProductId[LSERVER_MAX_STRING_SIZE+2]; Product_Info ProductInfo; TLServerInfo ServerInfo;
DBGPrintf( DBG_INFORMATION, DBG_FACILITY_RPC, DBGLEVEL_FUNCTION_TRACE, _TEXT("ForwardNewLicenseRequest() ...\n") );
dwStatus = TLSLookupRegisteredServer( pszServerSetupId, NULL, NULL, &ServerInfo );
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
if(TLSCanForwardRequest( TLS_CURRENT_VERSION, ServerInfo.GetServerVersion() ) == FALSE) { SetLastError(dwStatus = ERROR_INVALID_PARAMETER); goto cleanup; }
DBGPrintf( DBG_INFORMATION, DBG_FACILITY_RPC, DBGLEVEL_FUNCTION_TRACE, _TEXT("ForwardNewLicenseRequest() to %s %s\n"), pszServerSetupId, ServerInfo.GetServerName() );
hHandle = TLSConnectToServerWithServerId(pszServerSetupId); if(hHandle == NULL) { //
// server not available
//
dwStatus = GetLastError(); goto cleanup; }
//TlsRequestToRequest(pRequest, &LicenseRequest);
if(pRequest->cbEncryptedHwid >= sizeof(pbEncryptedHwid)) { TLSASSERT(FALSE); SetLastError(dwStatus = ERROR_INVALID_DATA); goto cleanup; }
if(pRequest->ProductInfo.cbCompanyName >= sizeof(szCompanyName) || pRequest->ProductInfo.cbProductID >= sizeof(szProductId) ) { TLSASSERT(FALSE); SetLastError(dwStatus = ERROR_INVALID_DATA); goto cleanup; }
memset(&LicenseRequest, 0, sizeof(LicenseRequest));
memcpy( pbEncryptedHwid, pRequest->pbEncryptedHwid, pRequest->cbEncryptedHwid );
LicenseRequest.pbEncryptedHwid = pbEncryptedHwid; LicenseRequest.cbEncryptedHwid = pRequest->cbEncryptedHwid; LicenseRequest.dwLanguageID = pRequest->dwLanguageID; LicenseRequest.dwPlatformID = pRequest->dwPlatformID; LicenseRequest.pProductInfo = &ProductInfo;
ProductInfo.dwVersion = pRequest->ProductInfo.dwVersion; ProductInfo.pbCompanyName = (PBYTE)szCompanyName; ProductInfo.pbProductID = (PBYTE)szProductId; ProductInfo.cbCompanyName = pRequest->ProductInfo.cbCompanyName; ProductInfo.cbProductID = pRequest->ProductInfo.cbProductID;
memset(szCompanyName, 0, sizeof(szCompanyName)); memset(szProductId, 0, sizeof(szProductId));
memcpy( szCompanyName, pRequest->ProductInfo.pbCompanyName, pRequest->ProductInfo.cbCompanyName );
memcpy( szProductId, pRequest->ProductInfo.pbProductID, pRequest->ProductInfo.cbProductID );
if(IsServiceShuttingdown() == TRUE) { dwStatus = TLS_I_SERVICE_STOP; } else { dwStatus = TLSIssueNewLicenseExEx( hHandle, pdwSupportFlags, ChallengeContext, &LicenseRequest, pszMachineName, pszUserName, cbChallengeResponse, pbChallengeResponse, bAcceptTemporaryLicense, bAcceptFewerLicenses, pdwQuantity, pcbLicense, ppbLicense, pdwErrCode ); }
cleanup:
if(hHandle) { TLSDisconnectFromServer(hHandle); }
return dwStatus; }
//---------------------------------------------------------
DWORD TLSForwardUpgradeRequest( IN PTLSForwardUpgradeLicenseRequest pForward, IN OUT DWORD *pdwSupportFlags, IN PTLSDBLICENSEREQUEST pRequest, OUT PDWORD pcbLicense, OUT PBYTE* ppbLicense ) /*++
++*/ { DWORD dwStatus = ERROR_SUCCESS; DWORD dwErrCode = ERROR_SUCCESS; PTLSDbWorkSpace pDbWkSpace = NULL; TLServerInfo ServerInfo; TLSLICENSEPACK search; TLSLICENSEPACK found; DWORD dwSupportFlagsTemp;
SAFESTRCPY(search.szProductId,pRequest->pszProductId);
pDbWkSpace = AllocateWorkSpace(g_EnumDbTimeout); if(pDbWkSpace == NULL) { dwStatus=TLS_E_ALLOCATE_HANDLE; goto cleanup; }
try { dwStatus = TLSDBKeyPackEnumBegin( pDbWkSpace, TRUE, LSKEYPACK_SEARCH_PRODUCTID, &search );
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
while( (dwStatus = TLSDBKeyPackEnumNext(pDbWkSpace, &found)) == ERROR_SUCCESS ) { if(IsServiceShuttingdown() == TRUE) { SetLastError(dwStatus = TLS_I_SERVICE_STOP); break; }
#if 0
if(!(found.ucAgreementType & LSKEYPACK_REMOTE_TYPE)) { continue; } #endif
if(!(found.ucKeyPackStatus & LSKEYPACKSTATUS_REMOTE)) { continue; }
if(found.wMajorVersion < HIWORD(pRequest->dwProductVersion)) { continue; }
if(found.wMinorVersion < LOWORD(pRequest->dwProductVersion)) { continue; }
if((found.dwPlatformType & ~LSKEYPACK_PLATFORM_REMOTE) != pRequest->dwPlatformID) { continue; }
if(_tcsicmp(found.szCompanyName, pRequest->pszCompanyName) != 0) { continue; }
//
// Save the original Support flags; they can be changed
//
dwSupportFlagsTemp = *pdwSupportFlags;
//
// make call to remote server
//
dwStatus = ForwardUpgradeLicenseRequest( found.szInstallId, &dwSupportFlagsTemp, pForward->m_pRequest, pForward->m_ChallengeContext, pForward->m_cbChallengeResponse, pForward->m_pbChallengeResponse, pForward->m_cbOldLicense, pForward->m_pbOldLicense, pcbLicense, ppbLicense, &dwErrCode );
if (dwStatus == ERROR_SUCCESS && dwErrCode == LSERVER_S_SUCCESS) { *pdwSupportFlags = dwSupportFlagsTemp;
break; }
if (dwStatus == TLS_I_SERVICE_STOP) { break; }
// try next server
dwStatus = ERROR_SUCCESS; }
TLSDBKeyPackEnumEnd(pDbWkSpace); } catch( SE_Exception e ) { dwStatus = e.getSeNumber(); } catch( ... ) { dwStatus = TLS_E_INTERNAL; } cleanup:
if(pDbWkSpace != NULL) { ReleaseWorkSpace(&pDbWkSpace); }
return dwStatus; }
//-----------------------------------------------------------------------
DWORD TLSForwardLicenseRequest( IN PTLSForwardNewLicenseRequest pForward, IN OUT DWORD *pdwSupportFlags, IN PTLSDBLICENSEREQUEST pRequest, IN BOOL bAcceptFewerLicenses, IN OUT DWORD *pdwQuantity, OUT PDWORD pcbLicense, OUT PBYTE* ppbLicense ) /*++
++*/ { DWORD dwStatus = ERROR_SUCCESS; DWORD dwErrCode = ERROR_SUCCESS; PTLSDbWorkSpace pDbWkSpace = NULL; TLServerInfo ServerInfo; TLSLICENSEPACK search; TLSLICENSEPACK found; DWORD dwSupportFlagsTemp; DWORD dwQuantityTemp;
SAFESTRCPY(search.szProductId,pRequest->pszProductId);
pDbWkSpace = AllocateWorkSpace(g_EnumDbTimeout); if(pDbWkSpace == NULL) { dwStatus=TLS_E_ALLOCATE_HANDLE; goto cleanup; }
try { dwStatus = TLSDBKeyPackEnumBegin( pDbWkSpace, TRUE, LSKEYPACK_SEARCH_PRODUCTID, &search );
if(dwStatus != ERROR_SUCCESS) { goto cleanup; }
while( (dwStatus = TLSDBKeyPackEnumNext(pDbWkSpace, &found)) == ERROR_SUCCESS ) { if(IsServiceShuttingdown() == TRUE) { SetLastError(dwStatus = TLS_I_SERVICE_STOP); break; }
#if 0
if(!(found.ucAgreementType & LSKEYPACK_REMOTE_TYPE)) { continue; } #endif
if(!(found.ucKeyPackStatus & LSKEYPACKSTATUS_REMOTE)) { continue; }
if(found.wMajorVersion < HIWORD(pRequest->dwProductVersion)) { continue; }
if(found.wMinorVersion < LOWORD(pRequest->dwProductVersion)) { continue; }
if((found.dwPlatformType & ~LSKEYPACK_PLATFORM_REMOTE) != pRequest->dwPlatformID) { continue; }
if(_tcsicmp(found.szCompanyName, pRequest->pszCompanyName) != 0) { continue; }
//
// Save the original support flags and quantity;
// they can be changed
//
dwSupportFlagsTemp = *pdwSupportFlags; dwQuantityTemp = *pdwQuantity;
//
// make call to remote server
//
dwStatus = ForwardNewLicenseRequest( found.szInstallId, &dwSupportFlagsTemp, pForward->m_ChallengeContext, pForward->m_pRequest, pForward->m_szMachineName, pForward->m_szUserName, pForward->m_cbChallengeResponse, pForward->m_pbChallengeResponse, FALSE, // bAcceptTemporaryLicense
bAcceptFewerLicenses, &dwQuantityTemp, pcbLicense, ppbLicense, &dwErrCode );
if (dwStatus == ERROR_SUCCESS && dwErrCode == LSERVER_S_SUCCESS) { *pdwSupportFlags = dwSupportFlagsTemp; *pdwQuantity = dwQuantityTemp;
break; }
if (dwStatus == TLS_I_SERVICE_STOP) { break; }
// try next server
dwStatus = ERROR_SUCCESS; }
TLSDBKeyPackEnumEnd(pDbWkSpace); } catch( SE_Exception e ) { dwStatus = e.getSeNumber(); } catch( ... ) { dwStatus = TLS_E_INTERNAL; }
cleanup:
if(pDbWkSpace != NULL) { ReleaseWorkSpace(&pDbWkSpace); }
return dwStatus; }
|