xref: /reactos/dll/win32/wldap32/rename.c (revision cc439606)
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_rename_extA     (WLDAP32.@)
41  *
42  *  See ldap_rename_extW.
43  */
44 ULONG CDECL ldap_rename_extA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR newrdn,
45     PCHAR newparent, INT delete, PLDAPControlA *serverctrls,
46     PLDAPControlA *clientctrls, ULONG *message )
47 {
48     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
49 #ifdef HAVE_LDAP
50     WCHAR *dnW = NULL, *newrdnW = NULL, *newparentW = NULL;
51     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
52 
53     ret = WLDAP32_LDAP_NO_MEMORY;
54 
55     TRACE( "(%p, %s, %s, %s, 0x%02x, %p, %p, %p)\n", ld, debugstr_a(dn),
56            debugstr_a(newrdn), debugstr_a(newparent), delete,
57            serverctrls, clientctrls, message );
58 
59     if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
60 
61     if (dn) {
62         dnW = strAtoW( dn );
63         if (!dnW) goto exit;
64     }
65     if (newrdn) {
66         newrdnW = strAtoW( newrdn );
67         if (!newrdnW) goto exit;
68     }
69     if (newparent) {
70         newparentW = strAtoW( newparent );
71         if (!newparentW) goto exit;
72     }
73     if (serverctrls) {
74         serverctrlsW = controlarrayAtoW( serverctrls );
75         if (!serverctrlsW) goto exit;
76     }
77     if (clientctrls) {
78         clientctrlsW = controlarrayAtoW( clientctrls );
79         if (!clientctrlsW) goto exit;
80     }
81 
82     ret = ldap_rename_extW( ld, dnW, newrdnW, newparentW, delete,
83                             serverctrlsW, clientctrlsW, message );
84 
85 exit:
86     strfreeW( dnW );
87     strfreeW( newrdnW );
88     strfreeW( newparentW );
89     controlarrayfreeW( serverctrlsW );
90     controlarrayfreeW( clientctrlsW );
91 
92 #endif
93     return ret;
94 }
95 
96 /***********************************************************************
97  *      ldap_rename_extW     (WLDAP32.@)
98  *
99  * Change the DN of a directory entry (asynchronous operation).
100  *
101  * PARAMS
102  *  ld          [I] Pointer to an LDAP context.
103  *  dn          [I] DN of the entry to change.
104  *  newrdn      [I] New RDN for the entry.
105  *  newparent   [I] New parent for the entry.
106  *  delete      [I] Delete old RDN?
107  *  serverctrls [I] Array of LDAP server controls.
108  *  clientctrls [I] Array of LDAP client controls.
109  *  message     [O] Message ID of the operation.
110  *
111  * RETURNS
112  *  Success: LDAP_SUCCESS
113  *  Failure: An LDAP error code.
114  *
115  * NOTES
116  *  Call ldap_result with the message ID to get the result of
117  *  the operation. Cancel the operation by calling ldap_abandon
118  *  with the message ID.
119  */
120 ULONG CDECL ldap_rename_extW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newrdn,
121     PWCHAR newparent, INT delete, PLDAPControlW *serverctrls,
122     PLDAPControlW *clientctrls, ULONG *message )
123 {
124     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
125 #ifdef HAVE_LDAP
126     char *dnU = NULL, *newrdnU = NULL, *newparentU = NULL;
127     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
128 
129     ret = WLDAP32_LDAP_NO_MEMORY;
130 
131     TRACE( "(%p, %s, %s, %s, 0x%02x, %p, %p, %p)\n", ld, debugstr_w(dn),
132            debugstr_w(newrdn), debugstr_w(newparent), delete,
133            serverctrls, clientctrls, message );
134 
135     if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
136 
137     if (dn) {
138         dnU = strWtoU( dn );
139         if (!dnU) goto exit;
140     }
141     if (newrdn) {
142         newrdnU = strWtoU( newrdn );
143         if (!newrdnU) goto exit;
144     }
145     if (newparent) {
146         newparentU = strWtoU( newparent );
147         if (!newparentU) goto exit;
148     }
149     if (serverctrls) {
150         serverctrlsU = controlarrayWtoU( serverctrls );
151         if (!serverctrlsU) goto exit;
152     }
153     if (clientctrls) {
154         clientctrlsU = controlarrayWtoU( clientctrls );
155         if (!clientctrlsU) goto exit;
156     }
157 
158     ret = map_error( ldap_rename( ld, dn ? dnU : "", newrdn ? newrdnU : "", newparentU,
159                                   delete, serverctrlsU, clientctrlsU, (int *)message ));
160 
161 exit:
162     strfreeU( dnU );
163     strfreeU( newrdnU );
164     strfreeU( newparentU );
165     controlarrayfreeU( serverctrlsU );
166     controlarrayfreeU( clientctrlsU );
167 
168 #endif
169     return ret;
170 }
171 
172 /***********************************************************************
173  *      ldap_rename_ext_sA     (WLDAP32.@)
174  *
175  *  See ldap_rename_ext_sW.
176  */
177 ULONG CDECL ldap_rename_ext_sA( WLDAP32_LDAP *ld, PCHAR dn, PCHAR newrdn,
178     PCHAR newparent, INT delete, PLDAPControlA *serverctrls,
179     PLDAPControlA *clientctrls )
180 {
181     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
182 #ifdef HAVE_LDAP
183     WCHAR *dnW = NULL, *newrdnW = NULL, *newparentW = NULL;
184     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
185 
186     ret = WLDAP32_LDAP_NO_MEMORY;
187 
188     TRACE( "(%p, %s, %s, %s, 0x%02x, %p, %p)\n", ld, debugstr_a(dn),
189            debugstr_a(newrdn), debugstr_a(newparent), delete,
190            serverctrls, clientctrls );
191 
192     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
193 
194     if (dn) {
195         dnW = strAtoW( dn );
196         if (!dnW) goto exit;
197     }
198     if (newrdn) {
199         newrdnW = strAtoW( newrdn );
200         if (!newrdnW) goto exit;
201     }
202     if (newparent) {
203         newparentW = strAtoW( newparent );
204         if (!newparentW) goto exit;
205     }
206     if (serverctrls) {
207         serverctrlsW = controlarrayAtoW( serverctrls );
208         if (!serverctrlsW) goto exit;
209     }
210     if (clientctrls) {
211         clientctrlsW = controlarrayAtoW( clientctrls );
212         if (!clientctrlsW) goto exit;
213     }
214 
215     ret = ldap_rename_ext_sW( ld, dnW, newrdnW, newparentW, delete,
216                               serverctrlsW, clientctrlsW );
217 
218 exit:
219     strfreeW( dnW );
220     strfreeW( newrdnW );
221     strfreeW( newparentW );
222     controlarrayfreeW( serverctrlsW );
223     controlarrayfreeW( clientctrlsW );
224 
225 #endif
226     return ret;
227 }
228 /***********************************************************************
229  *      ldap_rename_ext_sW     (WLDAP32.@)
230  *
231  * Change the DN of a directory entry (synchronous operation).
232  *
233  * PARAMS
234  *  ld          [I] Pointer to an LDAP context.
235  *  dn          [I] DN of the entry to change.
236  *  newrdn      [I] New RDN for the entry.
237  *  newparent   [I] New parent for the entry.
238  *  delete      [I] Delete old RDN?
239  *  serverctrls [I] Array of LDAP server controls.
240  *  clientctrls [I] Array of LDAP client controls.
241  *
242  * RETURNS
243  *  Success: LDAP_SUCCESS
244  *  Failure: An LDAP error code.
245  */
246 ULONG CDECL ldap_rename_ext_sW( WLDAP32_LDAP *ld, PWCHAR dn, PWCHAR newrdn,
247     PWCHAR newparent, INT delete, PLDAPControlW *serverctrls,
248     PLDAPControlW *clientctrls )
249 {
250     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
251 #ifdef HAVE_LDAP
252     char *dnU = NULL, *newrdnU = NULL, *newparentU = NULL;
253     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
254 
255     ret = WLDAP32_LDAP_NO_MEMORY;
256 
257     TRACE( "(%p, %s, %s, %s, 0x%02x, %p, %p)\n", ld, debugstr_w(dn),
258            debugstr_w(newrdn), debugstr_w(newparent), delete,
259            serverctrls, clientctrls );
260 
261     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
262 
263     if (dn) {
264         dnU = strWtoU( dn );
265         if (!dnU) goto exit;
266     }
267     if (newrdn) {
268         newrdnU = strWtoU( newrdn );
269         if (!newrdnU) goto exit;
270     }
271     if (newparent) {
272         newparentU = strWtoU( newparent );
273         if (!newparentU) goto exit;
274     }
275     if (serverctrls) {
276         serverctrlsU = controlarrayWtoU( serverctrls );
277         if (!serverctrlsU) goto exit;
278     }
279     if (clientctrls) {
280         clientctrlsU = controlarrayWtoU( clientctrls );
281         if (!clientctrlsU) goto exit;
282     }
283 
284     ret = map_error( ldap_rename_s( ld, dn ? dnU : "", newrdn ? newrdnU : "", newparentU,
285                                     delete, serverctrlsU, clientctrlsU ));
286 
287 exit:
288     strfreeU( dnU );
289     strfreeU( newrdnU );
290     strfreeU( newparentU );
291     controlarrayfreeU( serverctrlsU );
292     controlarrayfreeU( clientctrlsU );
293 
294 #endif
295     return ret;
296 }
297