Initial import
[samba] / source / include / smb_ldap.h
1 /* 
2    Unix SMB/CIFS Implementation.
3    LDAP protocol helper functions for SAMBA
4    Copyright (C) Volker Lendecke 2004
5     
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19    
20 */
21
22 #ifndef _SMB_LDAP_H
23 #define _SMB_LDAP_H
24
25 enum ldap_request_tag {
26         LDAP_TAG_BindRequest = 0,
27         LDAP_TAG_BindResponse = 1,
28         LDAP_TAG_UnbindRequest = 2,
29         LDAP_TAG_SearchRequest = 3,
30         LDAP_TAG_SearchResultEntry = 4,
31         LDAP_TAG_SearchResultDone = 5,
32         LDAP_TAG_ModifyRequest = 6,
33         LDAP_TAG_ModifyResponse = 7,
34         LDAP_TAG_AddRequest = 8,
35         LDAP_TAG_AddResponse = 9,
36         LDAP_TAG_DelRequest = 10,
37         LDAP_TAG_DelResponse = 11,
38         LDAP_TAG_ModifyDNRequest = 12,
39         LDAP_TAG_ModifyDNResponse = 13,
40         LDAP_TAG_CompareRequest = 14,
41         LDAP_TAG_CompareResponse = 15,
42         LDAP_TAG_AbandonRequest = 16,
43         LDAP_TAG_SearchResultReference = 19,
44         LDAP_TAG_ExtendedRequest = 23,
45         LDAP_TAG_ExtendedResponse = 24
46 };
47
48 enum ldap_auth_mechanism {
49         LDAP_AUTH_MECH_SIMPLE = 0,
50         LDAP_AUTH_MECH_SASL = 3
51 };
52
53 #ifndef LDAP_SUCCESS
54 enum ldap_result_code {
55         LDAP_SUCCESS = 0,
56         LDAP_SASL_BIND_IN_PROGRESS = 0x0e,
57         LDAP_INVALID_CREDENTIALS = 0x31,
58         LDAP_OTHER = 0x50
59 };
60 #endif /* LDAP_SUCCESS */
61
62 struct ldap_Result {
63         int resultcode;
64         const char *dn;
65         const char *errormessage;
66         const char *referral;
67 };
68
69 struct ldap_attribute {
70         const char *name;
71         int num_values;
72         DATA_BLOB *values;
73 };
74
75 struct ldap_BindRequest {
76         int version;
77         const char *dn;
78         enum ldap_auth_mechanism mechanism;
79         union {
80                 const char *password;
81                 struct {
82                         const char *mechanism;
83                         DATA_BLOB secblob;
84                 } SASL;
85         } creds;
86 };
87
88 struct ldap_BindResponse {
89         struct ldap_Result response;
90         union {
91                 DATA_BLOB secblob;
92         } SASL;
93 };
94
95 struct ldap_UnbindRequest {
96         uint8 __dummy;
97 };
98
99 enum ldap_scope {
100         LDAP_SEARCH_SCOPE_BASE = 0,
101         LDAP_SEARCH_SCOPE_SINGLE = 1,
102         LDAP_SEARCH_SCOPE_SUB = 2
103 };
104
105 enum ldap_deref {
106         LDAP_DEREFERENCE_NEVER = 0,
107         LDAP_DEREFERENCE_IN_SEARCHING = 1,
108         LDAP_DEREFERENCE_FINDING_BASE = 2,
109         LDAP_DEREFERENCE_ALWAYS
110 };
111
112 struct ldap_SearchRequest {
113         const char *basedn;
114         enum ldap_scope scope;
115         enum ldap_deref deref;
116         uint32 timelimit;
117         uint32 sizelimit;
118         BOOL attributesonly;
119         char *filter;
120         int num_attributes;
121         const char **attributes;
122 };
123
124 struct ldap_SearchResEntry {
125         const char *dn;
126         int num_attributes;
127         struct ldap_attribute *attributes;
128 };
129
130 struct ldap_SearchResRef {
131         int num_referrals;
132         const char **referrals;
133 };
134
135 enum ldap_modify_type {
136         LDAP_MODIFY_NONE = -1,
137         LDAP_MODIFY_ADD = 0,
138         LDAP_MODIFY_DELETE = 1,
139         LDAP_MODIFY_REPLACE = 2
140 };
141
142 struct ldap_mod {
143         enum ldap_modify_type type;
144         struct ldap_attribute attrib;
145 };
146
147 struct ldap_ModifyRequest {
148         const char *dn;
149         int num_mods;
150         struct ldap_mod *mods;
151 };
152
153 struct ldap_AddRequest {
154         const char *dn;
155         int num_attributes;
156         struct ldap_attribute *attributes;
157 };
158
159 struct ldap_DelRequest {
160         const char *dn;
161 };
162
163 struct ldap_ModifyDNRequest {
164         const char *dn;
165         const char *newrdn;
166         BOOL deleteolddn;
167         const char *newsuperior;
168 };
169
170 struct ldap_CompareRequest {
171         const char *dn;
172         const char *attribute;
173         const char *value;
174 };
175
176 struct ldap_AbandonRequest {
177         uint32 messageid;
178 };
179
180 struct ldap_ExtendedRequest {
181         const char *oid;
182         DATA_BLOB value;
183 };
184
185 struct ldap_ExtendedResponse {
186         struct ldap_Result response;
187         const char *name;
188         DATA_BLOB value;
189 };
190
191 union ldap_Request {
192         struct ldap_BindRequest         BindRequest;
193         struct ldap_BindResponse        BindResponse;
194         struct ldap_UnbindRequest       UnbindRequest;
195         struct ldap_SearchRequest       SearchRequest;
196         struct ldap_SearchResEntry      SearchResultEntry;
197         struct ldap_Result              SearchResultDone;
198         struct ldap_SearchResRef        SearchResultReference;
199         struct ldap_ModifyRequest       ModifyRequest;
200         struct ldap_Result              ModifyResponse;
201         struct ldap_AddRequest          AddRequest;
202         struct ldap_Result              AddResponse;
203         struct ldap_DelRequest          DelRequest;
204         struct ldap_Result              DelResponse;
205         struct ldap_ModifyDNRequest     ModifyDNRequest;
206         struct ldap_Result              ModifyDNResponse;
207         struct ldap_CompareRequest      CompareRequest;
208         struct ldap_Result              CompareResponse;
209         struct ldap_AbandonRequest      AbandonRequest;
210         struct ldap_ExtendedRequest     ExtendedRequest;
211         struct ldap_ExtendedResponse    ExtendedResponse;
212 };
213
214 struct ldap_Control {
215         const char *oid;
216         BOOL        critical;
217         DATA_BLOB   value;
218 };
219
220 struct ldap_message {
221         TALLOC_CTX             *mem_ctx;
222         uint32                  messageid;
223         uint8                   type;
224         union  ldap_Request     r;
225         int                     num_controls;
226         struct ldap_Control    *controls;
227 };
228
229 struct ldap_queue_entry {
230         struct ldap_queue_entry *next, *prev;
231         int msgid;
232         struct ldap_message *msg;
233 };
234
235 struct ldap_connection {
236         TALLOC_CTX *mem_ctx;
237         int sock;
238         int next_msgid;
239         char *host;
240         uint16 port;
241         BOOL ldaps;
242
243         const char *auth_dn;
244         const char *simple_pw;
245
246         /* Current outstanding search entry */
247         int searchid;
248
249         /* List for incoming search entries */
250         struct ldap_queue_entry *search_entries;
251
252         /* Outstanding LDAP requests that have not yet been replied to */
253         struct ldap_queue_entry *outstanding;
254 };
255
256 #endif