Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

342 lines
14 KiB

/**********************************************************************/
/** Microsoft Passport **/
/** Copyright(c) Microsoft Corporation, 1999 - 2001 **/
/**********************************************************************/
/*
manager.h
Define CManager class for passport manager interface
FILE HISTORY:
*/
// Manager.h : Declaration of the CManager
#ifndef __MANAGER_H_
#define __MANAGER_H_
#include "resource.h" // main symbols
#include "Passport.h"
#include "Ticket.h"
#include "Profile.h"
#include "passportservice.h"
#include <httpext.h>
#include <httpfilt.h>
using namespace ATL;
inline bool IsEmptyString(LPCWSTR str)
{
if (!str) return true;
if (*str == 0) return true;
return false;
};
/////////////////////////////////////////////////////////////////////////////
// CManager
class ATL_NO_VTABLE CManager :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CManager, &CLSID_Manager>,
public ISupportErrorInfo,
public IPassportService,
public IDispatchImpl<IPassportManager3, &IID_IPassportManager3, &LIBID_PASSPORTLib>,
public IDomainMap
{
public:
CManager();
~CManager();
public:
DECLARE_REGISTRY_RESOURCEID(IDR_MANAGER)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CManager)
COM_INTERFACE_ENTRY(IPassportManager)
COM_INTERFACE_ENTRY(IPassportManager2)
COM_INTERFACE_ENTRY(IPassportManager3)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IPassportService)
COM_INTERFACE_ENTRY(IDomainMap)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()
HRESULT FinalConstruct()
{
if(m_pUnkMarshaler.p != NULL)
return S_OK;
return CoCreateFreeThreadedMarshaler(
GetControllingUnknown(), &m_pUnkMarshaler.p);
}
void FinalRelease()
{
m_pUnkMarshaler.Release();
}
CComPtr<IUnknown> m_pUnkMarshaler;
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// IPassportManager
public:
STDMETHOD(HaveConsent)(/*[in]*/ VARIANT_BOOL bNeedFullConsent, /*[in]*/ VARIANT_BOOL bNeedBirthdate, /*[out,retval]*/ VARIANT_BOOL* pbHaveConsent);
STDMETHOD(GetServerInfo)(/*[out,retval]*/ BSTR *pbstrOut);
STDMETHOD(Commit)(BSTR *newProf);
STDMETHOD(get_HasSavedPassword)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(get_ProfileByIndex)(/*[in]*/ int index, /*[out, retval]*/ VARIANT *pVal);
STDMETHOD(put_ProfileByIndex)(/*[in]*/ int index, /*[in]*/ VARIANT newVal);
STDMETHOD(get_Profile)(/*[in]*/ BSTR attributeName, /*[out, retval]*/ VARIANT *pVal);
STDMETHOD(put_Profile)(/*[in]*/ BSTR attributeName, /*[in]*/ VARIANT newVal);
STDMETHOD(DomainFromMemberName)(/*[in,optional]*/ VARIANT memberName, /*[out,retval]*/ BSTR *pDomainName);
STDMETHOD(GetDomainAttribute)(/*[in]*/ BSTR attributeName, /*[in,optional]*/ VARIANT lcid, /*[in,optional]*/ VARIANT domain, /*[out,retval]*/ BSTR *pAttrVal);
STDMETHOD(get_TimeSinceSignIn)(/*[out, retval]*/ int *pVal);
STDMETHOD(get_TicketAge)(/*[out, retval]*/ int *pVal);
STDMETHOD(get_SignInTime)(/*[out, retval]*/ long *pVal);
STDMETHOD(get_TicketTime)(/*[out, retval]*/ long *pVal);
STDMETHOD(HasFlag)(/*[in]*/ VARIANT flagMask, /*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(get_FromNetworkServer)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(get_HasTicket)(/*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(HasProfile)(/*[in]*/ VARIANT profileName, /*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(LogoTag)(/*[in]*/ VARIANT returnUrl, /*[in]*/ VARIANT TimeWindow, /*[in]*/ VARIANT ForceLogin, VARIANT coBrandTemplate, VARIANT lang_id, VARIANT bSecure, VARIANT NameSpace, /*[in, optional*/ VARIANT KPP, /*[in, optional]*/ VARIANT SecureLevel, /*[out, retval]*/ BSTR *pVal);
STDMETHOD(LogoTag2)(/*[in]*/ VARIANT returnUrl, /*[in]*/ VARIANT TimeWindow, /*[in]*/ VARIANT ForceLogin, VARIANT coBrandTemplate, VARIANT lang_id, VARIANT bSecure, VARIANT NameSpace, /*[in, optional*/ VARIANT KPP, /*[in, optional]*/ VARIANT SecureLevel, /*[out, retval]*/ BSTR *pVal);
STDMETHOD(IsAuthenticated)(/*[in]*/ VARIANT TimeWindow, /*[in]*/ VARIANT ForceLogin, /*[in,optional]*/ VARIANT SecureLevel, /*[out, retval]*/ VARIANT_BOOL *pVal);
STDMETHOD(AuthURL)(/*[in]*/ VARIANT returnUrl, /*[in]*/ VARIANT TimeWindow, /*[in]*/ VARIANT ForceLogin, VARIANT coBrandTemplate, VARIANT lang_id, VARIANT NameSpace, /*[in, optional]*/ VARIANT KPP, /*[in, optional]*/ VARIANT SecureLevel, /*[out,retval]*/ BSTR *pAuthUrl);
STDMETHOD(AuthURL2)(/*[in]*/ VARIANT returnUrl, /*[in]*/ VARIANT TimeWindow, /*[in]*/ VARIANT ForceLogin, VARIANT coBrandTemplate, VARIANT lang_id, VARIANT NameSpace, /*[in, optional]*/ VARIANT KPP, /*[in, optional]*/ VARIANT SecureLevel, /*[out,retval]*/ BSTR *pAuthUrl);
// New API. call it to generate user logon. ASP caller will get a redirect.
// isapi callers should not do any more work after this
STDMETHOD(LoginUser)(/*[in]*/ VARIANT returnUrl,
/*[in]*/ VARIANT TimeWindow,
/*[in]*/ VARIANT ForceLogin,
/*[in]*/ VARIANT coBrandTemplate,
/*[in]*/ VARIANT lang_id,
/*[in]*/ VARIANT NameSpace,
/*[in, optional]*/ VARIANT KPP,
/*[in, optional]*/ VARIANT SecureLevel,
/*[in, optional]*/ VARIANT ExtraParams);
//Active Server Pages Methods
STDMETHOD(OnStartPage)(IUnknown* IUnk);
STDMETHOD(OnStartPageManual)(BSTR qsT, BSTR qsP, BSTR mspauth, BSTR mspprof, BSTR mspconsent, VARIANT vmspsec, VARIANT *pCookies);
STDMETHOD(OnStartPageECB)(/*[in]*/ LPBYTE pECB, /*[in,out]*/ DWORD *pBufSize, /*[out]*/ LPSTR pCookieHeader);
STDMETHOD(OnStartPageFilter)(/*[in]*/ LPBYTE pPFC, /*[in,out]*/ DWORD *pBufSize, /*[out]*/ LPSTR pCookieHeader);
STDMETHOD(OnStartPageASP)(/*[in]*/ IDispatch* pdispRequest, /*[in]*/ IDispatch* pdispResponse);
STDMETHOD(OnEndPage)();
STDMETHOD(_Ticket)(IPassportTicket** piTicket);
STDMETHOD(_Profile)(IPassportProfile** piProfile);
STDMETHOD(get_Domains)(VARIANT* pArrayVal);
STDMETHOD(get_Error)(long* pErrorVal);
// IPassportManager3
STDMETHOD(get_Ticket)(/*[in]*/ BSTR attributeName, /*[out, retval]*/ VARIANT *pVal);
STDMETHOD(GetCurrentConfig)(/*[in]*/ BSTR name, /*[out, retval]*/ VARIANT *pVal)
{
if (!m_pRegistryConfig)
{
AtlReportError(CLSID_Manager, PP_E_NOT_INITIALIZEDSTR,
IID_IPassportManager, PP_E_NOT_INITIALIZED);
return PP_E_NOT_INITIALIZED;
}
else
return m_pRegistryConfig->GetCurrentConfig(name, pVal);
};
STDMETHOD(LogoutURL)(
/* [optional][in] */ VARIANT returnUrl,
/* [optional][in] */ VARIANT coBrandArgs,
/* [optional][in] */ VARIANT lang_id,
/* [optional][in] */ VARIANT NameSpace,
/* [optional][in] */ VARIANT bSecure,
/* [retval][out] */ BSTR *pVal);
STDMETHOD(GetLoginChallenge)(/*[in]*/ VARIANT returnUrl,
/*[in]*/ VARIANT TimeWindow,
/*[in]*/ VARIANT ForceLogin,
/*[in]*/ VARIANT coBrandTemplate,
/*[in]*/ VARIANT lang_id,
/*[in]*/ VARIANT NameSpace,
/*[in, optional]*/ VARIANT KPP,
/*[in, optional]*/ VARIANT SecureLevel,
/*[in, optional]*/ VARIANT ExtraParams,
// /*[out, optional]*/ VARIANT *pAuthHeader,
/*[out, retval]*/ BSTR* pAuthHeader
);
STDMETHOD(get_HexPUID)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(get_PUID)(/*[out, retval]*/ BSTR *pVal);
STDMETHOD(OnStartPageHTTPRawEx)(
/* [in] */ LPCSTR method,
/* [in] */ LPCSTR path,
/* [in] */ LPCSTR QS,
/* [in] */ LPCSTR HTTPVer,
/* [string][in] */ LPCSTR headers,
/* [in] */ DWORD flags,
/* [out][in] */ DWORD *bufSize,
/* [size_is][out]*/ LPSTR pCookieHeader);
STDMETHOD(OnStartPageHTTPRaw)(
/* [string][in] */ LPCSTR request_line,
/* [string][in] */ LPCSTR headers,
/* [in] */ DWORD flags,
/* [out][in] */ DWORD *pBufSize,
/* [size_is][out] */ LPSTR pCookieHeader);
STDMETHOD(ContinueStartPageHTTPRaw)(
/* [in] */ DWORD bodyLen,
/* [size_is][in] */ byte *body,
/* [out][in] */ DWORD *pBufSize,
/* [size_is][out] */ LPSTR pRespHeaders,
/* [out][in] */ DWORD *pRespBodyLen,
/* [size_is][out] */ byte *pRespBody);
STDMETHOD(get_Option)(
/* [in] */ BSTR name,
/* [retval][out] */ VARIANT *pVal);
STDMETHOD(put_Option)(
/* [in] */ BSTR name,
/* [in] */ VARIANT newVal);
// IDomainMap
public:
// GetDomainAttribute and get_Domains declared above.
STDMETHOD(DomainExists)(BSTR bstrDomainName, VARIANT_BOOL* pbExists);
// IPassportService
public:
STDMETHOD(Initialize)(BSTR, IServiceProvider*);
STDMETHOD(Shutdown)();
STDMETHOD(ReloadState)(IServiceProvider*);
STDMETHOD(CommitState)(IServiceProvider*);
STDMETHOD(DumpState)( BSTR* );
protected:
void wipeState();
// return S_OK -- altered, should use two returned output params for MSPAuth and MSPSecAuth as cookies
HRESULT IfAlterAuthCookie(BSTR* pMSPAuth, BSTR* pMSPSecAuth);
// return S_OK -- should use the generated MSPConsent cookie
HRESULT IfConsentCookie(BSTR* pMSPConsent);
private:
STDMETHOD(GetLoginChallengeInternal)(/*[in]*/ VARIANT returnUrl,
/*[in]*/ VARIANT TimeWindow,
/*[in]*/ VARIANT ForceLogin,
/*[in]*/ VARIANT coBrandTemplate,
/*[in]*/ VARIANT lang_id,
/*[in]*/ VARIANT NameSpace,
/*[in, optional]*/ VARIANT KPP,
/*[in, optional]*/ VARIANT SecureLevel,
/*[in, optional]*/ VARIANT ExtraParams,
/*[out, optional]*/ VARIANT *pAuthHeader,
/*[out, retval]*/ BSTR* pAuthVal
);
STDMETHOD(CommonAuthURL)(VARIANT returnUrl,
VARIANT TimeWindow,
VARIANT ForceLogin,
VARIANT coBrandTemplate,
VARIANT lang_id,
VARIANT NameSpace,
VARIANT KPP,
VARIANT SecureLevel,
BOOL fRedirToSelf,
VARIANT functionArea,
BSTR *pAuthUrl);
BOOL handleQueryStringData(BSTR a, BSTR p);
BOOL handleCookieData(BSTR a, BSTR p, BSTR c, BSTR s);
BOOL checkForPassportChallenge(IRequestDictionaryPtr piServerVariables);
BOOL HeaderFromQS(PWSTR pszQS, _bstr_t& bstrHeader);
STDMETHODIMP FormatAuthHeaderFromParams(PCWSTR pszLoginUrl, // unused for now
PCWSTR pszRetUrl,
ULONG ulTimeWindow,
BOOL fForceLogin,
time_t ct,
PCWSTR pszCBT, // unused for now
PCWSTR pszNamespace,
int nKpp,
PWSTR pszlcid,
ULONG ulSecLevel,
_bstr_t& strHeader // return result
);
STDMETHOD(CommonLogoTag)(VARIANT returnUrl,
VARIANT TimeWindow,
VARIANT ForceLogin,
VARIANT coBrandTemplate,
VARIANT lang_id,
VARIANT bSecure,
VARIANT NameSpace,
VARIANT KPP,
VARIANT SecureLevel,
BOOL fRedirToSelf,
BSTR *pVal);
// helper for coming up with login paramers based on
// what the site passed in and registry configs
// someone should put all these in a class, so the number of
// params stays manageable
STDMETHOD(GetLoginParams)(// this is what the caller passed in
VARIANT vRU,
VARIANT vTimeWindow,
VARIANT vForceLogin,
VARIANT vCoBrand,
VARIANT vLCID,
VARIANT vNameSpace,
VARIANT vKPP,
VARIANT vSecureLevel,
// these are the processed values
_bstr_t& url,
_bstr_t& returnUrl,
UINT& TimeWindow,
VARIANT_BOOL& ForceLogin,
time_t& ct,
_bstr_t& strCBT,
_bstr_t& strNameSpace,
int& nKpp,
ULONG& ulSecureLevel,
PWSTR pszlcid);
VARIANT_BOOL m_profileValid;
VARIANT_BOOL m_ticketValid;
CComObject<CTicket> *m_piTicket;
CComObject<CProfile> *m_piProfile;
CRegistryConfig* m_pRegistryConfig;
IRequestPtr m_piRequest; //Request Object
IResponsePtr m_piResponse; //Response Object
bool m_bOnStartPageCalled; //OnStartPage successful?
bool m_fromQueryString;
// for ISAPI ....
EXTENSION_CONTROL_BLOCK *m_pECB;
PHTTP_FILTER_CONTEXT m_pFC;
// is it 1.4 capable client?
BOOL m_bIsTweenerCapable;
long m_lNetworkError;
// secure sign in
bool m_bSecureTransported;
CComVariant m_iModeOption;
BOOL IfCreateTPF()
{
if (V_VT(&m_iModeOption) == VT_BOOL && V_BOOL(&m_iModeOption) == VARIANT_TRUE)
return FALSE;
return TRUE;
}
};
#endif //__MANAGER_H_