249 lines
6 KiB
C++
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
|