windows-nt/Source/XPSP1/NT/net/tapi/skywalker/rend/rndldap.h
2020-09-26 16:20:57 +08:00

249 lines
6 KiB
C++

/*++
Copyright (c) 1997-2000 Microsoft Corporation
Module Name:
rndldap.h
Abstract:
Some ldap definitions and functions.
--*/
//
// Some constants.
//
#ifndef __RNDLDAP_H_
#define __RNDLDAP_H_
#pragma once
#include "rndcommc.h"
const WCHAR DYNAMIC_USER_CN_FORMAT[] = L"%s]%hs";
const WCHAR DYNAMIC_USER_DN_FORMAT[] = L"cn=%s,%s";
const WCHAR DYNAMIC_CONTAINER[] = L"ou=dynamic,";
const WCHAR DYNAMICOBJECT[] = L"DynamicObject";
const WCHAR OBJECTCLASS[] = L"ObjectClass";
const WCHAR USEROBJECT[] = L"userObject";
const WCHAR NT_SECURITY_DESCRIPTOR[] = L"ntSecurityDescriptor";
const WCHAR AT_CHARACTER = L'@';
const WCHAR ANY_OBJECT_CLASS[] = L"ObjectClass=*";
const WCHAR DEFAULT_NAMING_CONTEXT[] = L"defaultNamingContext";
const WCHAR CNEQUALS[] = L"cn=";
const WCHAR ENTRYTTL[] = L"EntryTTL";
const WCHAR CLOSE_BRACKET_CHARACTER = L']';
const WCHAR NULL_CHARACTER = L'\0';
// decimal values for the following ports
const WORD ILS_PORT = 1002;
const WORD ILS_SSL_PORT = 637; // ZoltanS changed from 4999
const WORD MINIMUM_TTL = 300;
const DWORD REND_LDAP_TIMELIMIT = 60; // 60 seconds
/////////////////////////////////////////////////////////////////////////////
// CLdapPtr is a smart pointer for a ldap connection.
/////////////////////////////////////////////////////////////////////////////
class CLdapPtr
{
public:
CLdapPtr() : m_hLdap(NULL) {}
CLdapPtr(LDAP *hLdap) : m_hLdap(hLdap) {}
~CLdapPtr() { if (m_hLdap) ldap_unbind(m_hLdap);}
CLdapPtr &operator= (LDAP *hLdap) { m_hLdap = hLdap; return *this;}
operator LDAP* () { return m_hLdap; }
private:
LDAP *m_hLdap;
};
/////////////////////////////////////////////////////////////////////////////
// CLdapMsgPtr is a smart pointer for a ldap message.
/////////////////////////////////////////////////////////////////////////////
class CLdapMsgPtr
{
public:
CLdapMsgPtr() : m_pLdapMsg(NULL) {}
CLdapMsgPtr(IN LDAPMessage *LdapMessage) : m_pLdapMsg(LdapMessage) {}
~CLdapMsgPtr() { ldap_msgfree(m_pLdapMsg); }
LDAPMessage **operator& () { return &m_pLdapMsg; }
operator LDAPMessage * () { return m_pLdapMsg; }
CLdapMsgPtr& operator=(LDAPMessage *p) { m_pLdapMsg = p; return *this; }
private:
LDAPMessage *m_pLdapMsg;
};
/////////////////////////////////////////////////////////////////////////////
// CLdapValuePtr is a smart pointer for a ldap value.
/////////////////////////////////////////////////////////////////////////////
class CLdapValuePtr
{
public:
CLdapValuePtr(IN TCHAR **Value) : m_Value(Value) {}
~CLdapValuePtr() { ldap_value_free(m_Value); }
protected:
TCHAR **m_Value;
};
/////////////////////////////////////////////////////////////////////////////
// other functions
/////////////////////////////////////////////////////////////////////////////
inline HRESULT
HResultFromErrorCodeWithoutLogging(IN long ErrorCode)
{
return ( 0x80070000 | (0xa000ffff & ErrorCode) );
}
inline HRESULT
GetLdapHResult(
IN ULONG LdapResult
)
{
return HRESULT_FROM_ERROR_CODE((long)LdapMapErrorToWin32(LdapResult));
}
inline BOOL
CompareLdapHResult(
IN HRESULT hr,
IN ULONG LdapErrorCode
)
{
return ( hr == GetLdapHResult(LdapErrorCode));
}
#define BAIL_IF_LDAP_FAIL(Result, msg) \
{ \
ULONG _res_ = Result; \
if ( LDAP_SUCCESS != _res_ ) \
{ \
LOG((MSP_ERROR, "%S - %d:%S", msg, _res_, ldap_err2string(_res_)));\
return GetLdapHResult(_res_); \
} \
}
// ZoltanS: For when we want to note an LDAP error and find the HR, but not bail.
inline HRESULT
LogAndGetLdapHResult(ULONG Result, TCHAR * msg)
{
BAIL_IF_LDAP_FAIL(Result, msg);
return S_OK;
}
// ZoltanS: For when we want to find the HR, but not bail or log
inline HRESULT
GetLdapHResultIfFailed(ULONG Result)
{
if ( Result != LDAP_SUCCESS )
{
return HResultFromErrorCodeWithoutLogging(
(long) LdapMapErrorToWin32( Result ) );
}
return S_OK;
}
inline WORD
GetOtherPort(IN WORD CurrentPort)
{
switch (CurrentPort)
{
case LDAP_PORT: return LDAP_SSL_PORT;
case LDAP_SSL_PORT: return LDAP_PORT;
case ILS_PORT: return ILS_SSL_PORT;
case ILS_SSL_PORT: return ILS_PORT;
}
// We don't support SSL unless the server is using a well-known
// non-SSL port. Basically we would otherwise have to also publish
// SSL ports in the DS in addition to non-SSL ports.
_ASSERTE(FALSE);
return CurrentPort; // was LDAP_PORT
}
HRESULT GetAttributeValue(
IN LDAP * pLdap,
IN LDAPMessage * pEntry,
IN const WCHAR * pName,
OUT BSTR * pValue
);
HRESULT GetAttributeValueBer(
IN LDAP * pLdap,
IN LDAPMessage * pEntry,
IN const WCHAR * pName,
OUT char ** pValue,
OUT DWORD * pdwSize
);
HRESULT GetNamingContext(
LDAP *hLdap,
TCHAR **ppNamingContext
);
ULONG
DoLdapSearch (
LDAP *ld,
PWCHAR base,
ULONG scope,
PWCHAR filter,
PWCHAR attrs[],
ULONG attrsonly,
LDAPMessage **res,
BOOL bSACL = TRUE
);
ULONG
DoLdapAdd (
LDAP *ld,
PWCHAR dn,
LDAPModW *attrs[]
);
ULONG
DoLdapModify (
BOOL fChase,
LDAP *ld,
PWCHAR dn,
LDAPModW *attrs[],
BOOL bSACL = TRUE
);
ULONG
DoLdapDelete (
LDAP *ld,
PWCHAR dn
);
HRESULT SetTTL(
IN LDAP * pLdap,
IN const WCHAR * pDN,
IN DWORD dwTTL
);
HRESULT UglyIPtoIP(
BSTR pUglyIP,
BSTR * pIP
);
HRESULT ParseUserName(
BSTR pName,
BSTR * ppAddress
);
#endif // __RNDLDAP_H_
// eof