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
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_
|