215 lines
7.2 KiB
C++
215 lines
7.2 KiB
C++
#ifndef __NmLdap_h__
|
||
#define __NmLdap_h__
|
||
|
||
#include <cstring.hpp>
|
||
#include "ldap.h"
|
||
|
||
class CKeepAlive;
|
||
|
||
|
||
class CNmLDAP
|
||
{
|
||
|
||
private:
|
||
|
||
typedef CSTRING string_type;
|
||
|
||
enum eState {
|
||
Uninitialized,
|
||
Idle, // Idle means we are not logged in, or connected
|
||
Binding, // We are waiting for bind_s to complete in helper thread
|
||
Bound, // The bind operation is complete
|
||
AddingUser, // We are waiting for the result to ldap_add
|
||
UserAdded, // ldap_add completed successfully
|
||
SettingAppInfo, // We are waiting for result to ldap_modify( app attributes )
|
||
ModifyingAttrs, // We are waiting for result to ldap_modify( some attrs )
|
||
LoggedIn, // We are logged in to ldap server and m_ldap session is closed ( we are connectionless )
|
||
LoggingOff // We are waiting for result to ldap_delete
|
||
};
|
||
|
||
enum eCurrentOp {
|
||
Op_NoOp, // We are not in the middle of multi-state operation
|
||
Op_Logon, // Logon is: ldap_bind, ldap_add, ldap_modify
|
||
Op_Logoff, // Logoff is ldap_bind, ldap_delete
|
||
Op_Refresh_Logoff, // Refresh is ldap_bind, ldap_delete, ldap_unbind, Op_Logon
|
||
Op_Modifying_InCallAttr,// Modify in-call attrs is ldap_bind, ldap_modify
|
||
};
|
||
|
||
enum eTimerEvent {
|
||
PollForResultTimer = 666, // This is the timer ID passed to WM_TIMER
|
||
WaitForLogoffTimer
|
||
};
|
||
|
||
enum { RESULT_POLL_INTERVAL = 1000 }; // We poll ldap_result for this many milliseconds
|
||
enum { LOGOFF_WAIT_INTERVAL = 5000 }; // Max amound of time we will wait for logof to complete in the destructor...
|
||
|
||
/////////////////////////////////////////////////
|
||
/// Data
|
||
|
||
CKeepAlive *m_pKeepAlive;
|
||
|
||
// This indicates weather we have loaded wldap32.dll and the ldap functions
|
||
static bool ms_bLdapDLLLoaded;
|
||
HWND m_hWndHidden; // Hidden window for handling WM_TIMER and custom messages
|
||
eState m_State; // The current state we are in
|
||
eCurrentOp m_CurrentOp; // The current multi-state operation we are performing
|
||
LDAP* m_pLdap; // The current ldap session ( kept for multi-state and multi-state operations )
|
||
INT m_uMsgID; // Current async operation message id ( or INVALID_MSG_ID )
|
||
UINT_PTR m_ResultPollTimer; // Timer ID given to us by SetTimer
|
||
UINT_PTR m_LogoffTimer;
|
||
HANDLE m_hEventWaitForLogoffDone; // We attempt to logoff asynchronously
|
||
HANDLE m_hBindThread;
|
||
|
||
string_type m_strCurrentServer; // If we are logged in, we are logged in to this server
|
||
string_type m_strCurrentDN; // If we are logged in, this is our current DN
|
||
|
||
// User attributes
|
||
string_type m_strServer;
|
||
string_type m_strSurName;
|
||
string_type m_strGivenName;
|
||
string_type m_strEmailName;
|
||
string_type m_strComment;
|
||
string_type m_strLocation;
|
||
string_type m_strSecurityToken;
|
||
bool m_bVisible;
|
||
bool m_bAudioHardware;
|
||
bool m_bVideoHardware;
|
||
bool m_bInCall;
|
||
bool m_bDirty;
|
||
bool m_bRefreshAfterBindCompletes;
|
||
bool m_bLogoffAfterBindCompletes;
|
||
bool m_bSendInCallAttrWhenDone;
|
||
int m_iPort;
|
||
|
||
public:
|
||
|
||
CNmLDAP();
|
||
~CNmLDAP();
|
||
|
||
HRESULT Initialize(HINSTANCE hInst); // Initialize the CNmLDAP object
|
||
HRESULT LogonAsync(LPCTSTR pcszServer = NULL); // Logon to the specified server ( or default if NULL )
|
||
HRESULT Logoff(); // Logoff from the current surver
|
||
HRESULT OnSettingsChanged(); // Refresh our information on the server
|
||
HRESULT OnCallStarted(); // Update server information about our call state
|
||
HRESULT OnCallEnded(); // Update server information about our call state
|
||
bool IsLoggedOn() const; // Are we logged on?
|
||
bool IsLoggingOn() const; // Are we logged on?
|
||
bool IsBusy() const; // Are we in the middle of an async operation?
|
||
HRESULT GetStatusText(LPTSTR psz, int cch, UINT *idIcon=NULL) const; // Status text for status bar for example
|
||
|
||
// Static fns used for resolving users, etc.
|
||
static HRESULT ResolveUser(LPCTSTR pcszName, LPCTSTR pcszServer, LPTSTR pszIPAddr, DWORD cchMax, int port = DEFAULT_LDAP_PORT);
|
||
static bool IsInitialized() { return ms_bLdapDLLLoaded; }
|
||
|
||
private:
|
||
|
||
// Window Procedure and helpers
|
||
LRESULT WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
static LRESULT _sWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
||
static DWORD _sAsyncBindThreadFn(LPVOID lpParameter);
|
||
|
||
void _AddUser();
|
||
void _DeleteUser();
|
||
void _SetAppInfo();
|
||
void _ModifyInCallAttr();
|
||
HRESULT _BindAsync();
|
||
HRESULT _bCallChangedHelper();
|
||
HRESULT _GetUserSettingsFromRegistryAndGlobals();
|
||
void _OnLoggedOn();
|
||
void _OnLoggedOff();
|
||
void _OnLoggingOn();
|
||
void _OnLoggingOff();
|
||
void _AbandonAllAndSetState(eState new_state);
|
||
void _AbandonAllAndSetToIdle() { _AbandonAllAndSetState(Idle); }
|
||
void _AbandonAllAndRecoverState(void) { _AbandonAllAndSetState((ModifyingAttrs == m_State && NULL != m_pKeepAlive) ? LoggedIn : Idle); }
|
||
void _AbandonAllAndRecoverState(eCurrentOp op) { _AbandonAllAndSetState((Op_Modifying_InCallAttr == op && NULL != m_pKeepAlive) ? LoggedIn : Idle); }
|
||
|
||
void _MakeStatusText(UINT uResID, LPTSTR psz, UINT cch) const;
|
||
HRESULT _InternalLogoff(bool bRefreshLogoff);
|
||
HRESULT _RefreshServer();
|
||
void _OnAddingUserResult(int Result);
|
||
void _OnSettingAppInfoOrModifyingAttrsResult(int Result);
|
||
void _OnLoggingOffResult(int Result);
|
||
void _OnUserBindComplete(INT LdapResult, DWORD LastError );
|
||
void _OnTimer(UINT_PTR TimerID);
|
||
void _GetIpAddressOfLdapSession( LPTSTR szIpAddr, int cchMax, DWORD *pdwIPAddr );
|
||
|
||
static HRESULT _LoadLdapDLL();
|
||
|
||
HRESULT OnReLogon(void);
|
||
};
|
||
|
||
|
||
void InitNmLdapAndLogon();
|
||
|
||
extern CNmLDAP* g_pLDAP;
|
||
extern CPing* g_pPing;
|
||
|
||
|
||
|
||
|
||
|
||
enum { INITIAL_REFRESH_INTERVAL_MINUTES = 2 }; // Initial time before we send a message to the server to reset the TTL
|
||
enum { MIN_REFRESH_TIMEOUT_INTERVAL_MINUTES = 1 }; // Minimum timeout interval
|
||
enum { REFRESH_TIMEOUT_MARGIN = 2 }; // We send a refresh REFRESH_TIMEOUT_MARGIN minutes before the server TTL
|
||
|
||
enum { PING_TIMEOUT_INTERVAL = (10 * 1000) };
|
||
enum { PING_RETRIES = 9 };
|
||
|
||
enum { LDAP_TIMEOUT_IN_SECONDS = 45 };
|
||
|
||
|
||
class CKeepAlive
|
||
{
|
||
friend DWORD KeepAliveThreadProc(LPVOID);
|
||
|
||
public:
|
||
|
||
// called in the main thread
|
||
CKeepAlive(BOOL *pfRet, HWND hwndMainThread,
|
||
DWORD dwLocalIPAddress,
|
||
const TCHAR * const pcszServerName, UINT nPort,
|
||
LPTSTR pszKeepAliveFilter);
|
||
|
||
BOOL Start(void);
|
||
BOOL End(BOOL fSync = FALSE);
|
||
|
||
protected:
|
||
|
||
// called in the worker thread
|
||
~CKeepAlive(void);
|
||
BOOL SetServerIPAddress(void);
|
||
DWORD GetLocalIPAddress(LDAP *ld);
|
||
BOOL Ping(void);
|
||
BOOL Bind(LDAP *ld);
|
||
BOOL KeepAlive(LDAP *ld, UINT *pnRefreshInterval);
|
||
DWORD GetLocalIPAddress(void) { return m_dwLocalIPAddress; }
|
||
void SetLocalIPAddress(DWORD dwLocalIPAddress) { m_dwLocalIPAddress = dwLocalIPAddress; }
|
||
LPTSTR GetServerName(void) { return m_pszServerName; }
|
||
DWORD GetServerIPAddress(void) { return m_dwServerIPAddress; }
|
||
UINT GetServerPortNumber(void) { return m_nPort; }
|
||
void UpdateIPAddressOnServer(void);
|
||
|
||
private:
|
||
|
||
// called in the worker thread
|
||
void GetNewInterval(LDAP *ld, LDAPMessage *pMsg, UINT *pnRefreshInternval);
|
||
void ReLogon(void);
|
||
|
||
private:
|
||
|
||
HWND m_hwndMainThread;
|
||
DWORD m_dwLocalIPAddress;
|
||
DWORD m_dwServerIPAddress;
|
||
LPTSTR m_pszServerName;
|
||
UINT m_nPort;
|
||
LPTSTR m_pszKeepAliveFilter;
|
||
HANDLE m_hThread;
|
||
DWORD m_dwThreadID;
|
||
BOOL m_fAborted;
|
||
};
|
||
|
||
|
||
#endif // __NmLdap_h__
|
||
|