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.
298 lines
9.6 KiB
298 lines
9.6 KiB
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// Copyright (c) Microsoft Corporation, 1996
|
|
//
|
|
// Description:
|
|
//
|
|
// Microsoft LDAP Client.
|
|
//
|
|
// All Interfaces that are exposed to a CLIENT.
|
|
//
|
|
// History
|
|
//
|
|
// davidsan 04-24-96 Created.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
|
|
// OVERVIEW:
|
|
// The LDAP Client DLL defines an interface, ILdapClient, and a set of structure types
|
|
// listed below. The ILdapClient interface provides a set of methods for communicating
|
|
// with an LDAP-based directory service. The general approach taken is that calling an
|
|
// ILdapClient method such as HrSearch() will return a transaction ID, or XID. This XID
|
|
// can then be used in subsequent calls to wait for and retrieve the server's response;
|
|
// an example would be the HrGetSearchResponse() method, which takes an XID and returns
|
|
// the server's response to that search transaction. The HrGet*Response() functions can
|
|
// also be used to check if the response is present by providing a timeout value of 0, which
|
|
// will return immediately with LDAP_E_TIMEOUT if the data is not yet present.
|
|
|
|
#ifndef _LDAPCLI_H
|
|
#define _LDAPCLI_H
|
|
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// INCLUDES.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
#include <windows.h>
|
|
#include <objbase.h>
|
|
|
|
#include <ldaperr.h>
|
|
#include <ldap.h>
|
|
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// DECLARATIONS.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
|
|
#define LDAP_VER_CURRENT 2
|
|
#define INTERFACE_VER_CURRENT 1
|
|
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// TYPE DEFINITIONS.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
|
|
// NOTE! Make the 'Next' pointer be the first thing in all these linked-list structures!
|
|
|
|
// Attribute value.
|
|
typedef struct _attrval
|
|
{
|
|
struct _attrval *pvalNext;
|
|
char *szVal;
|
|
} VAL, *PVAL;
|
|
|
|
// Attribute. Contains an attribute name (also called attribute type) followed by a set
|
|
// of attribute values.
|
|
typedef struct _attribute
|
|
{
|
|
struct _attribute *pattrNext;
|
|
char *szAttrib;
|
|
PVAL pvalFirst;
|
|
} ATTR, *PATTR;
|
|
|
|
// Database Object. Consists of a DN which identifies the object, followed by a set of
|
|
// attributes.
|
|
typedef struct _object
|
|
{
|
|
struct _object *pobjNext;
|
|
char *szDN;
|
|
PATTR pattrFirst;
|
|
} OBJ, *POBJ;
|
|
|
|
// attribute value assertion
|
|
typedef struct _ava
|
|
{
|
|
char *szAttrib;
|
|
char *szValue;
|
|
} AVA, *PAVA;
|
|
|
|
// substrings filter. this is less general than the ldap spec. cope.
|
|
typedef struct _substrings
|
|
{
|
|
char *szAttrib;
|
|
char *szInitial;
|
|
char *szAny;
|
|
char *szFinal;
|
|
} SUB, *PSUB;
|
|
|
|
// search filter
|
|
typedef struct _filter
|
|
{
|
|
struct _filter *pfilterNext; // for chaining in sets
|
|
DWORD type;
|
|
union
|
|
{
|
|
struct _filter *pfilterSub;
|
|
AVA ava;
|
|
SUB sub;
|
|
char *szAttrib;
|
|
};
|
|
} FILTER, *PFILTER;
|
|
|
|
// search params
|
|
typedef struct _searchparms
|
|
{
|
|
char *szDNBase;
|
|
DWORD scope;
|
|
DWORD deref;
|
|
int cRecordsMax;
|
|
int cSecondsMax;
|
|
BOOL fAttrsOnly;
|
|
PFILTER pfilter;
|
|
int cAttrib;
|
|
char **rgszAttrib;
|
|
} SP, *PSP;
|
|
|
|
// modify params
|
|
typedef struct _modparms
|
|
{
|
|
struct _modparms *pmodNext;
|
|
int modop;
|
|
PATTR pattrFirst;
|
|
} MOD, *PMOD;
|
|
|
|
typedef DWORD XID, *PXID; // transaction ID
|
|
|
|
interface ILdapClient;
|
|
typedef interface ILdapClient LCLI, *PLCLI;
|
|
|
|
interface ICLdapClient;
|
|
typedef interface ICLdapClient CLCLI, *PCLCLI;
|
|
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTIONS.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// To get an LDAP client interface call this.
|
|
//
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
__declspec(dllexport) HRESULT __cdecl HrCreateLdapClient(int iVerLdap, int iVerInterface, PLCLI *pplcli);
|
|
__declspec(dllexport) HRESULT __cdecl HrCreateCLdapClient(int iVerLdap, int iVerInterface, PCLCLI *ppclcli);
|
|
__declspec(dllexport) HRESULT __cdecl HrFreePobjList(POBJ pobj);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
//--------------------------------------------------------------------------------------------
|
|
//
|
|
// INTERFACES: Definitions.
|
|
//
|
|
//--------------------------------------------------------------------------------------------
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE ILdapClient
|
|
|
|
DECLARE_INTERFACE_(ILdapClient, IUnknown)
|
|
{
|
|
// IUnknown:
|
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR *ppvObj) PURE;
|
|
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
|
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
|
|
|
// ILdapClient
|
|
|
|
STDMETHOD(HrConnect) (THIS_ CHAR *szServer, USHORT usPort) PURE;
|
|
STDMETHOD(HrDisconnect) (THIS) PURE;
|
|
STDMETHOD(HrIsConnected) (THIS) PURE;
|
|
|
|
STDMETHOD(HrBindSimple) (THIS_ char *szDN, char *szPass, PXID pxid) PURE;
|
|
STDMETHOD(HrGetBindResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
STDMETHOD(HrUnbind) (THIS) PURE; // this doesn't return an XID because there's no response
|
|
|
|
// this function is a synchronous wrapper around the SSPI bind gunk
|
|
//$ TODO: Pass in SSPI Package name (or support NTLM some other way)
|
|
STDMETHOD(HrBindSSPI) (THIS_ char *szDN, char *szUser, char *szPass, BOOL fPrompt, DWORD timeout) PURE;
|
|
STDMETHOD(HrSendSSPINegotiate) (THIS_ char *szDN, char *szUser, char *szPass, BOOL fPrompt, PXID pxid) PURE;
|
|
STDMETHOD(HrGetSSPIChallenge) (THIS_ XID xid, BYTE *pbBuf, int cbBuf, int *pcbChallenge, DWORD timeout) PURE;
|
|
STDMETHOD(HrSendSSPIResponse) (THIS_ BYTE *pbChallenge, int cbChallenge, PXID pxid) PURE;
|
|
|
|
STDMETHOD(HrSearch) (THIS_ PSP psp, PXID pxid) PURE;
|
|
STDMETHOD(HrGetSearchResponse) (THIS_ XID xid, DWORD timeout, POBJ *ppobj) PURE;
|
|
|
|
STDMETHOD(HrModify) (THIS_ char *szDN, PMOD pmod, PXID pxid) PURE;
|
|
STDMETHOD(HrGetModifyResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
|
|
STDMETHOD(HrAdd) (THIS_ char *szDN, PATTR pattr, PXID pxid) PURE;
|
|
STDMETHOD(HrGetAddResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
|
|
STDMETHOD(HrDelete) (THIS_ char *szDN, PXID pxid) PURE;
|
|
STDMETHOD(HrGetDeleteResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
|
|
STDMETHOD(HrModifyRDN) (THIS_ char *szDN, char *szNewRDN, BOOL fDeleteOldRDN, PXID pxid) PURE;
|
|
STDMETHOD(HrGetModifyRDNResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
|
|
STDMETHOD(HrCompare) (THIS_ char *szDN, char *szAttrib, char *szValue, PXID pxid) PURE;
|
|
STDMETHOD(HrGetCompareResponse) (THIS_ XID xid, DWORD timeout) PURE;
|
|
|
|
STDMETHOD(HrCancelXid) (THIS_ XID xid) PURE;
|
|
};
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE ICLdapClient
|
|
|
|
DECLARE_INTERFACE_(ICLdapClient, IUnknown)
|
|
{
|
|
// IUnknown:
|
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR *ppvObj) PURE;
|
|
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
|
|
STDMETHOD_(ULONG, Release) (THIS) PURE;
|
|
|
|
STDMETHOD(HrSetServerName) (THIS_ char *szServer, USHORT usPort) PURE;
|
|
STDMETHOD(HrSetServerIPAddr) (THIS_ SOCKADDR_IN *psin) PURE;
|
|
|
|
STDMETHOD(HrSearch) (THIS_ PSP psp, PXID pxid) PURE;
|
|
STDMETHOD(HrGetSearchResponse) (THIS_ XID xid, DWORD timeout, POBJ *ppobj) PURE;
|
|
STDMETHOD(HrCancelXid) (THIS_ XID xid) PURE;
|
|
};
|
|
|
|
// RFC1823 stuff
|
|
typedef struct ldap
|
|
{
|
|
// these are publically accessible fields. this is how you control the parameters
|
|
// of your search calls.
|
|
int ld_deref;
|
|
int ld_timelimit;
|
|
int ld_sizelimit;
|
|
int ld_errno;
|
|
|
|
// these are not publically accessible fields. pretend you didn't see them.
|
|
ILdapClient *plcli;
|
|
} LDAP;
|
|
|
|
typedef struct berval
|
|
{
|
|
unsigned long bv_len;
|
|
char *bv_val;
|
|
} BERVAL;
|
|
|
|
#define LDAP_AUTH_NONE 0
|
|
#define LDAP_AUTH_SIMPLE 1
|
|
#define LDAP_AUTH_KRBV41 2
|
|
#define LDAP_AUTH_KRBV42 3
|
|
|
|
typedef OBJ LDAPMessage;
|
|
|
|
#define DLLEXPORT __declspec(dllexport)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
DLLEXPORT LDAP * __cdecl ldap_open(char *hostname, int portno);
|
|
DLLEXPORT int __cdecl ldap_bind_s(LDAP *ld, char *dn, char *cred, int method);
|
|
DLLEXPORT int __cdecl ldap_unbind(LDAP *ld);
|
|
DLLEXPORT int __cdecl ldap_search_s(LDAP *ld, char *base, int scope, char *filter, char *attrs[], int attrsonly, LDAPMessage **res);
|
|
DLLEXPORT int __cdecl ldap_search_st(LDAP *ld, char *base, int scope, char *filter, char *attrs[], int attrsonly, struct timeval *timeout, LDAPMessage **res);
|
|
DLLEXPORT int __cdecl ldap_msgfree(LDAPMessage *res);
|
|
|
|
// result parsing stuff
|
|
DLLEXPORT LDAPMessage * __cdecl ldap_first_entry(LDAP *ld, LDAPMessage *res);
|
|
DLLEXPORT LDAPMessage * __cdecl ldap_next_entry(LDAP *ld, LDAPMessage *entry);
|
|
DLLEXPORT int __cdecl ldap_count_entries(LDAP *ld, LDAPMessage *res);
|
|
|
|
DLLEXPORT char * __cdecl ldap_first_attribute(LDAP *ld, LDAPMessage *entry, void **ptr);
|
|
DLLEXPORT char * __cdecl ldap_next_attribute(LDAP *ld, LDAPMessage *entry, void **ptr);
|
|
|
|
DLLEXPORT char ** __cdecl ldap_get_values(LDAP *ld, LDAPMessage *entry, char *attr);
|
|
DLLEXPORT struct berval ** __cdecl ldap_get_values_len(LDAP *ld, LDAPMessage *entry, char *attr);
|
|
DLLEXPORT int __cdecl ldap_count_values(char **vals);
|
|
DLLEXPORT int __cdecl ldap_count_values_len(struct berval **vals);
|
|
DLLEXPORT int __cdecl ldap_value_free(char **vals);
|
|
DLLEXPORT int __cdecl ldap_value_free_len(struct berval **vals);
|
|
|
|
DLLEXPORT char * __cdecl ldap_get_dn(LDAP *ld, LDAPMessage *entry);
|
|
DLLEXPORT void __cdecl ldap_free_dn(char *dn);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _LDAPCLI_H
|