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.
363 lines
9.1 KiB
363 lines
9.1 KiB
/*++
|
|
|
|
Copyright (c) 1997-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
rndils.h
|
|
|
|
Abstract:
|
|
|
|
Definitions for CILSDirectory class that handles ILS access.
|
|
|
|
--*/
|
|
|
|
#ifndef __RNDILS_H
|
|
#define __RNDILS_H
|
|
|
|
#pragma once
|
|
|
|
#include "thread.h"
|
|
#include "rndobjsf.h"
|
|
|
|
//
|
|
// Some constants.
|
|
//
|
|
|
|
const WCHAR ILS_IPADDRESS[] = L"ipAddress";
|
|
const WCHAR ILS_UIDEQUALS[] = L"uid=";
|
|
const WCHAR ILS_CONF_DN_FORMAT[] = L"uid=%s,%s";
|
|
const WCHAR ILS_RTCONFERENCE[] = L"RTConference";
|
|
const WCHAR ILS_RTPERSON[] = L"RTPerson";
|
|
const WCHAR NETMEETING_CONTAINER[] = L"appName=MS-NetMeeting,ou=applications,";
|
|
const WCHAR RTAPPLICATIONUSER[] = L"RTApplicationUser";
|
|
const WCHAR EMAIL[] = L"rfc822mailbox";
|
|
const WCHAR GIVEN_NAME[] = L"givenName"; // vocabulary word: this means "first name"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CILSDirectory
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
template <class T>
|
|
class ITDirectoryVtbl : public ITDirectory
|
|
{
|
|
};
|
|
|
|
template <class T>
|
|
class ITILSConfigVtbl : public ITILSConfig
|
|
{
|
|
};
|
|
|
|
|
|
class CILSDirectory :
|
|
public CComDualImpl<ITDirectoryVtbl<CILSDirectory>, &IID_ITDirectory, &LIBID_RENDLib>,
|
|
public CComDualImpl<ITILSConfigVtbl<CILSDirectory>, &IID_ITILSConfig, &LIBID_RENDLib>,
|
|
public ITDynamicDirectory,
|
|
public CComObjectRootEx<CComObjectThreadModel>,
|
|
public CObjectSafeImpl
|
|
{
|
|
|
|
/* ZoltanS debugging... */
|
|
private:
|
|
HRESULT AddConferenceComplete(BOOL fModify,
|
|
LDAP * ldap,
|
|
TCHAR ** ppDN,
|
|
LDAPMod ** mods,
|
|
DWORD TTL1,
|
|
DWORD TTL2);
|
|
|
|
public:
|
|
|
|
BEGIN_COM_MAP(CILSDirectory)
|
|
COM_INTERFACE_ENTRY2(IDispatch, ITDirectory)
|
|
COM_INTERFACE_ENTRY(ITILSConfig)
|
|
COM_INTERFACE_ENTRY(ITDirectory)
|
|
COM_INTERFACE_ENTRY(ITDynamicDirectory)
|
|
COM_INTERFACE_ENTRY(IObjectSafety)
|
|
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM)
|
|
END_COM_MAP()
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CILSDirectory)
|
|
DECLARE_GET_CONTROLLING_UNKNOWN()
|
|
|
|
public:
|
|
|
|
// ITILSConfig
|
|
STDMETHOD (get_Port) (
|
|
OUT long *Port
|
|
);
|
|
|
|
STDMETHOD (put_Port) (
|
|
IN long Port
|
|
);
|
|
|
|
// ITDirectory
|
|
STDMETHOD (get_DirectoryType) (
|
|
OUT DIRECTORY_TYPE * pDirectoryType
|
|
);
|
|
|
|
STDMETHOD (get_DisplayName) (
|
|
OUT BSTR *ppName
|
|
);
|
|
|
|
STDMETHOD (get_IsDynamic) (
|
|
OUT VARIANT_BOOL *pfDynamic
|
|
);
|
|
|
|
STDMETHOD (get_DefaultObjectTTL) (
|
|
OUT long *pTTL // in seconds
|
|
);
|
|
|
|
STDMETHOD (put_DefaultObjectTTL) (
|
|
IN long TTL // in sechods
|
|
);
|
|
|
|
STDMETHOD (EnableAutoRefresh) (
|
|
IN VARIANT_BOOL fEnable
|
|
);
|
|
|
|
STDMETHOD (Connect)(
|
|
IN VARIANT_BOOL fSecure
|
|
);
|
|
|
|
STDMETHOD (Bind) (
|
|
IN BSTR pDomainName,
|
|
IN BSTR pUserName,
|
|
IN BSTR pPassword,
|
|
IN long lFlags
|
|
);
|
|
|
|
STDMETHOD (AddDirectoryObject) (
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
STDMETHOD (ModifyDirectoryObject) (
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
STDMETHOD (RefreshDirectoryObject) (
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
STDMETHOD (DeleteDirectoryObject) (
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
STDMETHOD (get_DirectoryObjects) (
|
|
IN DIRECTORY_OBJECT_TYPE DirectoryObjectType,
|
|
IN BSTR pName,
|
|
OUT VARIANT * pVariant
|
|
);
|
|
|
|
STDMETHOD (EnumerateDirectoryObjects) (
|
|
IN DIRECTORY_OBJECT_TYPE DirectoryObjectType,
|
|
IN BSTR pName,
|
|
OUT IEnumDirectoryObject ** ppEnumObject
|
|
);
|
|
|
|
//
|
|
// IDispatch methods
|
|
//
|
|
|
|
STDMETHOD(GetIDsOfNames)(REFIID riid,
|
|
LPOLESTR* rgszNames,
|
|
UINT cNames,
|
|
LCID lcid,
|
|
DISPID* rgdispid
|
|
);
|
|
|
|
STDMETHOD(Invoke)(DISPID dispidMember,
|
|
REFIID riid,
|
|
LCID lcid,
|
|
WORD wFlags,
|
|
DISPPARAMS* pdispparams,
|
|
VARIANT* pvarResult,
|
|
EXCEPINFO* pexcepinfo,
|
|
UINT* puArgErr
|
|
);
|
|
|
|
|
|
// ITDynamicDirectory
|
|
STDMETHOD(Update)(DWORD dwSecondsPassed);
|
|
|
|
public:
|
|
CILSDirectory()
|
|
: m_Type(DT_ILS),
|
|
m_pServerName(NULL),
|
|
m_ldap(NULL),
|
|
m_pContainer(NULL),
|
|
m_pNMContainer(NULL),
|
|
m_IsSsl(FALSE),
|
|
m_TTL(ILS_UPDATE_INTERVAL),
|
|
m_fAutoRefresh(FALSE),
|
|
m_dwInterfaceAddress(0),
|
|
m_pFTM(NULL)
|
|
{}
|
|
|
|
virtual HRESULT FinalConstruct(void);
|
|
|
|
~CILSDirectory()
|
|
{
|
|
if ( m_pFTM )
|
|
{
|
|
m_pFTM->Release();
|
|
}
|
|
|
|
if (m_ldap)
|
|
{
|
|
ldap_unbind(m_ldap);
|
|
}
|
|
|
|
delete m_pServerName;
|
|
delete m_pContainer;
|
|
delete m_pNMContainer;
|
|
|
|
//
|
|
// We new'ed the DN strings in the refresh table. The destructor for
|
|
// the table will be called after this destructor and will delete
|
|
// the array itself.
|
|
//
|
|
|
|
for ( DWORD i = 0; i < m_RefreshTable.size(); i++ )
|
|
{
|
|
delete m_RefreshTable[i].pDN;
|
|
}
|
|
}
|
|
|
|
HRESULT Init(
|
|
IN const TCHAR * const strServerName,
|
|
IN const WORD wPort
|
|
);
|
|
|
|
static const WCHAR * RTConferenceAttributeName(int attribute)
|
|
{ return s_RTConferenceAttributes[MeetingAttrIndex(attribute)]; }
|
|
|
|
static const WCHAR * RTPersonAttributeName(int attribute)
|
|
{ return s_RTPersonAttributes[UserAttrIndex(attribute)]; }
|
|
|
|
private:
|
|
|
|
HRESULT TryServer(
|
|
IN WORD Port
|
|
);
|
|
|
|
HRESULT MakeConferenceDN(
|
|
IN TCHAR * pName,
|
|
OUT TCHAR ** ppDN
|
|
);
|
|
|
|
HRESULT MakeUserCN(
|
|
IN TCHAR * pName,
|
|
IN TCHAR * pAddress,
|
|
OUT TCHAR ** ppCN,
|
|
OUT DWORD * pdwIP
|
|
);
|
|
|
|
HRESULT MakeUserDN(
|
|
IN TCHAR * pCN,
|
|
OUT TCHAR ** ppDNRTPerson,
|
|
OUT TCHAR ** ppDNNMPerson
|
|
);
|
|
|
|
HRESULT PublishRTPerson(
|
|
IN TCHAR * pCN,
|
|
IN TCHAR * pDN,
|
|
IN TCHAR * pIPAddress,
|
|
IN DWORD dwTTL,
|
|
IN BOOL fModify,
|
|
IN char * pSD,
|
|
IN DWORD dwSDSize
|
|
);
|
|
|
|
HRESULT PublishNMPerson(
|
|
IN TCHAR * pCN,
|
|
IN TCHAR * pDN,
|
|
IN TCHAR * pDNRTPerson,
|
|
IN DWORD dwTTL,
|
|
IN BOOL fModify,
|
|
IN char * pSD,
|
|
IN DWORD dwSDSize
|
|
);
|
|
|
|
HRESULT AddConference(
|
|
IN ITDirectoryObject *pDirectoryObject,
|
|
IN BOOL fModify
|
|
);
|
|
|
|
HRESULT TestAclSafety(
|
|
IN char * pSD,
|
|
IN DWORD dwSDSize
|
|
);
|
|
|
|
HRESULT AddUser(
|
|
IN ITDirectoryObject *pDirectoryObject,
|
|
IN BOOL fModify
|
|
);
|
|
|
|
HRESULT DeleteConference(
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
HRESULT DeleteUser(
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
HRESULT RefreshUser(
|
|
IN ITDirectoryObject *pDirectoryObject
|
|
);
|
|
|
|
HRESULT CreateConference(
|
|
IN LDAPMessage * pEntry,
|
|
OUT ITDirectoryObject ** ppObject
|
|
);
|
|
|
|
HRESULT CreateUser(
|
|
IN LDAPMessage * pEntry,
|
|
IN ITDirectoryObject ** ppObject
|
|
);
|
|
|
|
HRESULT SearchObjects(
|
|
IN DIRECTORY_OBJECT_TYPE DirectoryObjectType,
|
|
IN BSTR pName,
|
|
OUT ITDirectoryObject *** pppDirectoryObject,
|
|
OUT DWORD * dwSize
|
|
);
|
|
|
|
HRESULT AddObjectToRefresh(
|
|
IN WCHAR *pDN,
|
|
IN long TTL
|
|
);
|
|
|
|
HRESULT RemoveObjectToRefresh(
|
|
IN WCHAR *pDN
|
|
);
|
|
|
|
HRESULT DiscoverInterface(void);
|
|
|
|
private:
|
|
static const WCHAR * const s_RTConferenceAttributes[];
|
|
static const WCHAR * const s_RTPersonAttributes[];
|
|
|
|
CCritSection m_lock;
|
|
|
|
DIRECTORY_TYPE m_Type;
|
|
TCHAR * m_pServerName;
|
|
WORD m_wPort;
|
|
|
|
LDAP * m_ldap;
|
|
TCHAR * m_pContainer;
|
|
TCHAR * m_pNMContainer;
|
|
BOOL m_IsSsl;
|
|
|
|
long m_TTL;
|
|
BOOL m_fAutoRefresh;
|
|
RefreshTable m_RefreshTable;
|
|
|
|
// the local IP we should use when publishing on this server
|
|
// Stored in network byte order.
|
|
DWORD m_dwInterfaceAddress;
|
|
|
|
IUnknown * m_pFTM; // pointer to the free threaded marshaler
|
|
};
|
|
|
|
#endif
|