/*++ 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