Merge branch 'master' of git://git.samba.org/samba into teventfix
[kai/samba.git] / libcli / ldap / ldap_message.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 3 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, see <http://www.gnu.org/licenses/>.
18    
19 */
20
21 #ifndef _LIBCLI_LDAP_MESSAGE_H_
22 #define _LIBCLI_LDAP_MESSAGE_H_
23
24 #include "../libcli/ldap/ldap_errors.h"
25 #include "lib/ldb/include/ldb.h"
26
27 enum ldap_request_tag {
28         LDAP_TAG_BindRequest = 0,
29         LDAP_TAG_BindResponse = 1,
30         LDAP_TAG_UnbindRequest = 2,
31         LDAP_TAG_SearchRequest = 3,
32         LDAP_TAG_SearchResultEntry = 4,
33         LDAP_TAG_SearchResultDone = 5,
34         LDAP_TAG_ModifyRequest = 6,
35         LDAP_TAG_ModifyResponse = 7,
36         LDAP_TAG_AddRequest = 8,
37         LDAP_TAG_AddResponse = 9,
38         LDAP_TAG_DelRequest = 10,
39         LDAP_TAG_DelResponse = 11,
40         LDAP_TAG_ModifyDNRequest = 12,
41         LDAP_TAG_ModifyDNResponse = 13,
42         LDAP_TAG_CompareRequest = 14,
43         LDAP_TAG_CompareResponse = 15,
44         LDAP_TAG_AbandonRequest = 16,
45         LDAP_TAG_SearchResultReference = 19,
46         LDAP_TAG_ExtendedRequest = 23,
47         LDAP_TAG_ExtendedResponse = 24
48 };
49
50 enum ldap_auth_mechanism {
51         LDAP_AUTH_MECH_SIMPLE = 0,
52         LDAP_AUTH_MECH_SASL = 3
53 };
54
55 struct ldap_Result {
56         int resultcode;
57         const char *dn;
58         const char *errormessage;
59         const char *referral;
60 };
61
62 struct ldap_BindRequest {
63         int version;
64         const char *dn;
65         enum ldap_auth_mechanism mechanism;
66         union {
67                 const char *password;
68                 struct {
69                         const char *mechanism;
70                         DATA_BLOB *secblob;/* optional */
71                 } SASL;
72         } creds;
73 };
74
75 struct ldap_BindResponse {
76         struct ldap_Result response;
77         union {
78                 DATA_BLOB *secblob;/* optional */
79         } SASL;
80 };
81
82 struct ldap_UnbindRequest {
83         uint8_t __dummy;
84 };
85
86 enum ldap_scope {
87         LDAP_SEARCH_SCOPE_BASE = 0,
88         LDAP_SEARCH_SCOPE_SINGLE = 1,
89         LDAP_SEARCH_SCOPE_SUB = 2
90 };
91
92 enum ldap_deref {
93         LDAP_DEREFERENCE_NEVER = 0,
94         LDAP_DEREFERENCE_IN_SEARCHING = 1,
95         LDAP_DEREFERENCE_FINDING_BASE = 2,
96         LDAP_DEREFERENCE_ALWAYS
97 };
98
99 struct ldap_SearchRequest {
100         const char *basedn;
101         enum ldap_scope scope;
102         enum ldap_deref deref;
103         uint32_t timelimit;
104         uint32_t sizelimit;
105         bool attributesonly;
106         struct ldb_parse_tree *tree;
107         int num_attributes;
108         const char * const *attributes;
109 };
110
111 struct ldap_SearchResEntry {
112         const char *dn;
113         int num_attributes;
114         struct ldb_message_element *attributes;
115 };
116
117 struct ldap_SearchResRef {
118         const char *referral;
119 };
120
121 enum ldap_modify_type {
122         LDAP_MODIFY_NONE = -1,
123         LDAP_MODIFY_ADD = 0,
124         LDAP_MODIFY_DELETE = 1,
125         LDAP_MODIFY_REPLACE = 2
126 };
127
128 struct ldap_mod {
129         enum ldap_modify_type type;
130         struct ldb_message_element attrib;
131 };
132
133 struct ldap_ModifyRequest {
134         const char *dn;
135         int num_mods;
136         struct ldap_mod *mods;
137 };
138
139 struct ldap_AddRequest {
140         const char *dn;
141         int num_attributes;
142         struct ldb_message_element *attributes;
143 };
144
145 struct ldap_DelRequest {
146         const char *dn;
147 };
148
149 struct ldap_ModifyDNRequest {
150         const char *dn;
151         const char *newrdn;
152         bool deleteolddn;
153         const char *newsuperior;/* optional */
154 };
155
156 struct ldap_CompareRequest {
157         const char *dn;
158         const char *attribute;
159         DATA_BLOB value;
160 };
161
162 struct ldap_AbandonRequest {
163         int messageid;
164 };
165
166 struct ldap_ExtendedRequest {
167         const char *oid;
168         DATA_BLOB *value;/* optional */
169 };
170
171 struct ldap_ExtendedResponse {
172         struct ldap_Result response;
173         const char *oid;/* optional */
174         DATA_BLOB *value;/* optional */
175 };
176
177 union ldap_Request {
178         struct ldap_Result              GeneralResult;
179         struct ldap_BindRequest         BindRequest;
180         struct ldap_BindResponse        BindResponse;
181         struct ldap_UnbindRequest       UnbindRequest;
182         struct ldap_SearchRequest       SearchRequest;
183         struct ldap_SearchResEntry      SearchResultEntry;
184         struct ldap_Result              SearchResultDone;
185         struct ldap_SearchResRef        SearchResultReference;
186         struct ldap_ModifyRequest       ModifyRequest;
187         struct ldap_Result              ModifyResponse;
188         struct ldap_AddRequest          AddRequest;
189         struct ldap_Result              AddResponse;
190         struct ldap_DelRequest          DelRequest;
191         struct ldap_Result              DelResponse;
192         struct ldap_ModifyDNRequest     ModifyDNRequest;
193         struct ldap_Result              ModifyDNResponse;
194         struct ldap_CompareRequest      CompareRequest;
195         struct ldap_Result              CompareResponse;
196         struct ldap_AbandonRequest      AbandonRequest;
197         struct ldap_ExtendedRequest     ExtendedRequest;
198         struct ldap_ExtendedResponse    ExtendedResponse;
199 };
200
201
202 struct ldap_message {
203         int                     messageid;
204         enum ldap_request_tag   type;
205         union ldap_Request      r;
206         struct ldb_control    **controls;
207         bool                   *controls_decoded;
208 };
209
210 struct ldap_control_handler {
211         const char *oid;
212         bool (*decode)(void *mem_ctx, DATA_BLOB in, void *_out);
213         bool (*encode)(void *mem_ctx, void *in, DATA_BLOB *out);
214 };
215
216 struct asn1_data;
217
218 struct ldap_message *new_ldap_message(TALLOC_CTX *mem_ctx);
219 NTSTATUS ldap_decode(struct asn1_data *data,
220                      const struct ldap_control_handler *control_handlers,
221                      struct ldap_message *msg);
222 bool ldap_encode(struct ldap_message *msg,
223                  const struct ldap_control_handler *control_handlers,
224                  DATA_BLOB *result, TALLOC_CTX *mem_ctx);
225 NTSTATUS ldap_full_packet(void *private_data, DATA_BLOB blob, size_t *packet_size);
226
227 bool asn1_read_OctetString_talloc(TALLOC_CTX *mem_ctx,
228                                   struct asn1_data *data,
229                                   const char **result);
230
231 void ldap_decode_attribs_bare(TALLOC_CTX *mem_ctx, struct asn1_data *data,
232                               struct ldb_message_element **attributes,
233                               int *num_attributes);
234
235 #endif