xref: /reactos/dll/win32/wldap32/delete.c (revision 2196a06f)
1 /*
2  * WLDAP32 - LDAP support for Wine
3  *
4  * Copyright 2005 Hans Leidekker
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library 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 GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "config.h"
22 #include "wine/port.h"
23 
24 #include <stdarg.h>
25 #ifdef HAVE_LDAP_H
26 #include <ldap.h>
27 #endif
28 
29 #include "windef.h"
30 #include "winbase.h"
31 #include "winnls.h"
32 
33 #include "winldap_private.h"
34 #include "wldap32.h"
35 #include "wine/debug.h"
36 
37 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
38 
39 /***********************************************************************
40  *      ldap_deleteA     (WLDAP32.@)
41  *
42  * See ldap_deleteW.
43  */
44 ULONG CDECL ldap_deleteA( WLDAP32_LDAP *ld, PCHAR dn )
45 {
46     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
47 #ifdef HAVE_LDAP
48     WCHAR *dnW = NULL;
49 
50     TRACE( "(%p, %s)\n", ld, debugstr_a(dn) );
51 
52     if (!ld) return ~0u;
53 
54     if (dn) {
55         dnW = strAtoW( dn );
56         if (!dnW) return WLDAP32_LDAP_NO_MEMORY;
57     }
58 
59     ret = ldap_deleteW( ld, dnW );
60     strfreeW( dnW );
61 
62 #endif
63     return ret;
64 }
65 
66 /***********************************************************************
67  *      ldap_deleteW     (WLDAP32.@)
68  *
69  * Delete an entry from a directory tree (asynchronous operation).
70  *
71  * PARAMS
72  *  ld      [I] Pointer to an LDAP context.
73  *  dn      [I] DN of the entry to delete.
74  *
75  * RETURNS
76  *  Success: Message ID of the add operation.
77  *  Failure: An LDAP error code.
78  *
79  * NOTES
80  *  Call ldap_result with the message ID to get the result of
81  *  the operation. Cancel the operation by calling ldap_abandon
82  *  with the message ID.
83  */
84 ULONG CDECL ldap_deleteW( WLDAP32_LDAP *ld, PWCHAR dn )
85 {
86     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
87 #ifdef HAVE_LDAP
88     char *dnU = NULL;
89     int msg;
90 
91     TRACE( "(%p, %s)\n", ld, debugstr_w(dn) );
92 
93     if (!ld) return ~0u;
94 
95     if (dn) {
96         dnU = strWtoU( dn );
97         if (!dnU) return WLDAP32_LDAP_NO_MEMORY;
98     }
99 
100     ret = ldap_delete_ext( ld, dn ? dnU : "", NULL, NULL, &msg );
101 
102     if (ret == LDAP_SUCCESS)
103         ret = msg;
104     else
105         ret = ~0u;
106 
107     strfreeU( dnU );
108 
109 #endif
110     return ret;
111 }
112 
113 /***********************************************************************
114  *      ldap_delete_extA     (WLDAP32.@)
115  *
116  * See ldap_delete_extW.
117  */
118 ULONG CDECL ldap_delete_extA( WLDAP32_LDAP *ld, PCHAR dn, PLDAPControlA *serverctrls,
119     PLDAPControlA *clientctrls, ULONG *message )
120 {
121     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
122 #ifdef HAVE_LDAP
123     WCHAR *dnW = NULL;
124     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
125 
126     TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_a(dn), serverctrls,
127            clientctrls, message );
128 
129     ret = WLDAP32_LDAP_NO_MEMORY;
130 
131     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
132 
133     if (dn) {
134         dnW = strAtoW( dn );
135         if (!dnW) goto exit;
136     }
137     if (serverctrls) {
138         serverctrlsW = controlarrayAtoW( serverctrls );
139         if (!serverctrlsW) goto exit;
140     }
141     if (clientctrls) {
142         clientctrlsW = controlarrayAtoW( clientctrls );
143         if (!clientctrlsW) goto exit;
144     }
145 
146     ret = ldap_delete_extW( ld, dnW, serverctrlsW, clientctrlsW, message );
147 
148 exit:
149     strfreeW( dnW );
150     controlarrayfreeW( serverctrlsW );
151     controlarrayfreeW( clientctrlsW );
152 
153 #endif
154     return ret;
155 }
156 
157 /***********************************************************************
158  *      ldap_delete_extW     (WLDAP32.@)
159  *
160  * Delete an entry from a directory tree (asynchronous operation).
161  *
162  * PARAMS
163  *  ld          [I] Pointer to an LDAP context.
164  *  dn          [I] DN of the entry to delete.
165  *  serverctrls [I] Array of LDAP server controls.
166  *  clientctrls [I] Array of LDAP client controls.
167  *  message     [O] Message ID of the delete operation.
168  *
169  * RETURNS
170  *  Success: LDAP_SUCCESS
171  *  Failure: An LDAP error code.
172  *
173  * NOTES
174  *  Call ldap_result with the message ID to get the result of
175  *  the operation. The serverctrls and clientctrls parameters are
176  *  optional and should be set to NULL if not used.
177  */
178 ULONG CDECL ldap_delete_extW( WLDAP32_LDAP *ld, PWCHAR dn, PLDAPControlW *serverctrls,
179     PLDAPControlW *clientctrls, ULONG *message )
180 {
181     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
182 #ifdef HAVE_LDAP
183     char *dnU = NULL;
184     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
185     int dummy;
186 
187     TRACE( "(%p, %s, %p, %p, %p)\n", ld, debugstr_w(dn), serverctrls,
188            clientctrls, message );
189 
190     ret = WLDAP32_LDAP_NO_MEMORY;
191 
192     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
193 
194     if (dn) {
195         dnU = strWtoU( dn );
196         if (!dnU) goto exit;
197     }
198     if (serverctrls) {
199         serverctrlsU = controlarrayWtoU( serverctrls );
200         if (!serverctrlsU) goto exit;
201     }
202     if (clientctrls) {
203         clientctrlsU = controlarrayWtoU( clientctrls );
204         if (!clientctrlsU) goto exit;
205     }
206 
207     ret = map_error( ldap_delete_ext( ld, dn ? dnU : "", serverctrlsU, clientctrlsU,
208                                       message ? (int *)message : &dummy ));
209 
210 exit:
211     strfreeU( dnU );
212     controlarrayfreeU( serverctrlsU );
213     controlarrayfreeU( clientctrlsU );
214 
215 #endif
216     return ret;
217 }
218 
219 /***********************************************************************
220  *      ldap_delete_ext_sA     (WLDAP32.@)
221  *
222  * See ldap_delete_ext_sW.
223  */
224 ULONG CDECL ldap_delete_ext_sA( WLDAP32_LDAP *ld, PCHAR dn, PLDAPControlA *serverctrls,
225     PLDAPControlA *clientctrls )
226 {
227     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
228 #ifdef HAVE_LDAP
229     WCHAR *dnW = NULL;
230     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
231 
232     TRACE( "(%p, %s, %p, %p)\n", ld, debugstr_a(dn), serverctrls,
233            clientctrls );
234 
235     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
236 
237     if (dn) {
238         dnW = strAtoW( dn );
239         if (!dnW) goto exit;
240     }
241     if (serverctrls) {
242         serverctrlsW = controlarrayAtoW( serverctrls );
243         if (!serverctrlsW) goto exit;
244     }
245     if (clientctrls) {
246         clientctrlsW = controlarrayAtoW( clientctrls );
247         if (!clientctrlsW) goto exit;
248     }
249 
250     ret = ldap_delete_ext_sW( ld, dnW, serverctrlsW, clientctrlsW );
251 
252 exit:
253     strfreeW( dnW );
254     controlarrayfreeW( serverctrlsW );
255     controlarrayfreeW( clientctrlsW );
256 
257 #endif
258     return ret;
259 }
260 
261 /***********************************************************************
262  *      ldap_delete_ext_sW     (WLDAP32.@)
263  *
264  * Delete an entry from a directory tree (synchronous operation).
265  *
266  * PARAMS
267  *  ld          [I] Pointer to an LDAP context.
268  *  dn          [I] DN of the entry to delete.
269  *  serverctrls [I] Array of LDAP server controls.
270  *  clientctrls [I] Array of LDAP client controls.
271  *
272  * RETURNS
273  *  Success: LDAP_SUCCESS
274  *  Failure: An LDAP error code.
275  *
276  * NOTES
277  *  The serverctrls and clientctrls parameters are optional and
278  *  should be set to NULL if not used.
279  */
280 ULONG CDECL ldap_delete_ext_sW( WLDAP32_LDAP *ld, PWCHAR dn, PLDAPControlW *serverctrls,
281     PLDAPControlW *clientctrls )
282 {
283     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
284 #ifdef HAVE_LDAP
285     char *dnU = NULL;
286     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
287 
288     TRACE( "(%p, %s, %p, %p)\n", ld, debugstr_w(dn), serverctrls,
289            clientctrls );
290 
291     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
292 
293     if (dn) {
294         dnU = strWtoU( dn );
295         if (!dnU) goto exit;
296     }
297     if (serverctrls) {
298         serverctrlsU = controlarrayWtoU( serverctrls );
299         if (!serverctrlsU) goto exit;
300     }
301     if (clientctrls) {
302         clientctrlsU = controlarrayWtoU( clientctrls );
303         if (!clientctrlsU) goto exit;
304     }
305 
306     ret = map_error( ldap_delete_ext_s( ld, dn ? dnU : "", serverctrlsU, clientctrlsU ));
307 
308 exit:
309     strfreeU( dnU );
310     controlarrayfreeU( serverctrlsU );
311     controlarrayfreeU( clientctrlsU );
312 
313 #endif
314     return ret;
315 }
316 
317 /***********************************************************************
318  *      ldap_delete_sA     (WLDAP32.@)
319  *
320  * See ldap_delete_sW.
321  */
322 ULONG CDECL ldap_delete_sA( WLDAP32_LDAP *ld, PCHAR dn )
323 {
324     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
325 #ifdef HAVE_LDAP
326     WCHAR *dnW = NULL;
327 
328     TRACE( "(%p, %s)\n", ld, debugstr_a(dn) );
329 
330     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
331 
332     if (dn) {
333         dnW = strAtoW( dn );
334         if (!dnW) return WLDAP32_LDAP_NO_MEMORY;
335     }
336 
337     ret = ldap_delete_sW( ld, dnW );
338     strfreeW( dnW );
339 
340 #endif
341     return ret;
342 }
343 
344 /***********************************************************************
345  *      ldap_delete_sW     (WLDAP32.@)
346  *
347  * Delete an entry from a directory tree (synchronous operation).
348  *
349  * PARAMS
350  *  ld      [I] Pointer to an LDAP context.
351  *  dn      [I] DN of the entry to delete.
352  *
353  * RETURNS
354  *  Success: LDAP_SUCCESS
355  *  Failure: An LDAP error code.
356  */
357 ULONG CDECL ldap_delete_sW( WLDAP32_LDAP *ld, PWCHAR dn )
358 {
359     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
360 #ifdef HAVE_LDAP
361     char *dnU = NULL;
362 
363     TRACE( "(%p, %s)\n", ld, debugstr_w(dn) );
364 
365     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
366 
367     if (dn) {
368         dnU = strWtoU( dn );
369         if (!dnU) return WLDAP32_LDAP_NO_MEMORY;
370     }
371 
372     ret = map_error( ldap_delete_ext_s( ld, dn ? dnU : "", NULL, NULL ));
373     strfreeU( dnU );
374 
375 #endif
376     return ret;
377 }
378