Leaked source code of windows server 2003
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

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