xref: /reactos/dll/win32/wldap32/extended.c (revision c2c66aff)
1*c2c66affSColin Finck /*
2*c2c66affSColin Finck  * WLDAP32 - LDAP support for Wine
3*c2c66affSColin Finck  *
4*c2c66affSColin Finck  * Copyright 2005 Hans Leidekker
5*c2c66affSColin Finck  *
6*c2c66affSColin Finck  * This library is free software; you can redistribute it and/or
7*c2c66affSColin Finck  * modify it under the terms of the GNU Lesser General Public
8*c2c66affSColin Finck  * License as published by the Free Software Foundation; either
9*c2c66affSColin Finck  * version 2.1 of the License, or (at your option) any later version.
10*c2c66affSColin Finck  *
11*c2c66affSColin Finck  * This library is distributed in the hope that it will be useful,
12*c2c66affSColin Finck  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*c2c66affSColin Finck  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*c2c66affSColin Finck  * Lesser General Public License for more details.
15*c2c66affSColin Finck  *
16*c2c66affSColin Finck  * You should have received a copy of the GNU Lesser General Public
17*c2c66affSColin Finck  * License along with this library; if not, write to the Free Software
18*c2c66affSColin Finck  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19*c2c66affSColin Finck  */
20*c2c66affSColin Finck 
21*c2c66affSColin Finck #include "winldap_private.h"
22*c2c66affSColin Finck 
23*c2c66affSColin Finck /***********************************************************************
24*c2c66affSColin Finck  *      ldap_close_extended_op     (WLDAP32.@)
25*c2c66affSColin Finck  *
26*c2c66affSColin Finck  * Close an extended operation.
27*c2c66affSColin Finck  *
28*c2c66affSColin Finck  * PARAMS
29*c2c66affSColin Finck  *  ld    [I] Pointer to an LDAP context.
30*c2c66affSColin Finck  *  msgid [I] Message ID of the operation to be closed.
31*c2c66affSColin Finck  *
32*c2c66affSColin Finck  * RETURNS
33*c2c66affSColin Finck  *  Success: LDAP_SUCCESS
34*c2c66affSColin Finck  *  Failure: An LDAP error code.
35*c2c66affSColin Finck  *
36*c2c66affSColin Finck  * NOTES
37*c2c66affSColin Finck  *  Contrary to native, OpenLDAP does not require us to close
38*c2c66affSColin Finck  *  extended operations, so this is a no-op.
39*c2c66affSColin Finck  */
40*c2c66affSColin Finck ULONG CDECL ldap_close_extended_op( WLDAP32_LDAP *ld, ULONG msgid )
41*c2c66affSColin Finck {
42*c2c66affSColin Finck     TRACE( "(%p, 0x%08x)\n", ld, msgid );
43*c2c66affSColin Finck 
44*c2c66affSColin Finck     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
45*c2c66affSColin Finck     return WLDAP32_LDAP_SUCCESS;
46*c2c66affSColin Finck }
47*c2c66affSColin Finck 
48*c2c66affSColin Finck /***********************************************************************
49*c2c66affSColin Finck  *      ldap_extended_operationA     (WLDAP32.@)
50*c2c66affSColin Finck  *
51*c2c66affSColin Finck  * See ldap_extended_operationW.
52*c2c66affSColin Finck  */
53*c2c66affSColin Finck ULONG CDECL ldap_extended_operationA( WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data,
54*c2c66affSColin Finck     PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, ULONG *message )
55*c2c66affSColin Finck {
56*c2c66affSColin Finck     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
57*c2c66affSColin Finck #ifdef HAVE_LDAP
58*c2c66affSColin Finck     WCHAR *oidW = NULL;
59*c2c66affSColin Finck     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
60*c2c66affSColin Finck 
61*c2c66affSColin Finck     ret = WLDAP32_LDAP_NO_MEMORY;
62*c2c66affSColin Finck 
63*c2c66affSColin Finck     TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls,
64*c2c66affSColin Finck            clientctrls, message );
65*c2c66affSColin Finck 
66*c2c66affSColin Finck     if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
67*c2c66affSColin Finck 
68*c2c66affSColin Finck     if (oid) {
69*c2c66affSColin Finck         oidW = strAtoW( oid );
70*c2c66affSColin Finck         if (!oidW) goto exit;
71*c2c66affSColin Finck     }
72*c2c66affSColin Finck     if (serverctrls) {
73*c2c66affSColin Finck         serverctrlsW = controlarrayAtoW( serverctrls );
74*c2c66affSColin Finck         if (!serverctrlsW) goto exit;
75*c2c66affSColin Finck     }
76*c2c66affSColin Finck     if (clientctrls) {
77*c2c66affSColin Finck         clientctrlsW = controlarrayAtoW( clientctrls );
78*c2c66affSColin Finck         if (!clientctrlsW) goto exit;
79*c2c66affSColin Finck     }
80*c2c66affSColin Finck 
81*c2c66affSColin Finck     ret = ldap_extended_operationW( ld, oidW, data, serverctrlsW, clientctrlsW, message );
82*c2c66affSColin Finck 
83*c2c66affSColin Finck exit:
84*c2c66affSColin Finck     strfreeW( oidW );
85*c2c66affSColin Finck     controlarrayfreeW( serverctrlsW );
86*c2c66affSColin Finck     controlarrayfreeW( clientctrlsW );
87*c2c66affSColin Finck 
88*c2c66affSColin Finck #endif
89*c2c66affSColin Finck     return ret;
90*c2c66affSColin Finck }
91*c2c66affSColin Finck 
92*c2c66affSColin Finck /***********************************************************************
93*c2c66affSColin Finck  *      ldap_extended_operationW     (WLDAP32.@)
94*c2c66affSColin Finck  *
95*c2c66affSColin Finck  * Perform an extended operation (asynchronous mode).
96*c2c66affSColin Finck  *
97*c2c66affSColin Finck  * PARAMS
98*c2c66affSColin Finck  *  ld          [I] Pointer to an LDAP context.
99*c2c66affSColin Finck  *  oid         [I] OID of the extended operation.
100*c2c66affSColin Finck  *  data        [I] Data needed by the operation.
101*c2c66affSColin Finck  *  serverctrls [I] Array of LDAP server controls.
102*c2c66affSColin Finck  *  clientctrls [I] Array of LDAP client controls.
103*c2c66affSColin Finck  *  message     [O] Message ID of the extended operation.
104*c2c66affSColin Finck  *
105*c2c66affSColin Finck  * RETURNS
106*c2c66affSColin Finck  *  Success: LDAP_SUCCESS
107*c2c66affSColin Finck  *  Failure: An LDAP error code.
108*c2c66affSColin Finck  *
109*c2c66affSColin Finck  * NOTES
110*c2c66affSColin Finck  *  The data parameter should be set to NULL if the operation
111*c2c66affSColin Finck  *  requires no data. Call ldap_result with the message ID to
112*c2c66affSColin Finck  *  get the result of the operation or ldap_abandon to cancel
113*c2c66affSColin Finck  *  the operation. The serverctrls and clientctrls parameters
114*c2c66affSColin Finck  *  are optional and should be set to NULL if not used. Call
115*c2c66affSColin Finck  *  ldap_close_extended_op to close the operation.
116*c2c66affSColin Finck  */
117*c2c66affSColin Finck ULONG CDECL ldap_extended_operationW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data,
118*c2c66affSColin Finck     PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, ULONG *message )
119*c2c66affSColin Finck {
120*c2c66affSColin Finck     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
121*c2c66affSColin Finck #ifdef HAVE_LDAP
122*c2c66affSColin Finck     char *oidU = NULL;
123*c2c66affSColin Finck     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
124*c2c66affSColin Finck 
125*c2c66affSColin Finck     ret = WLDAP32_LDAP_NO_MEMORY;
126*c2c66affSColin Finck 
127*c2c66affSColin Finck     TRACE( "(%p, %s, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls,
128*c2c66affSColin Finck            clientctrls, message );
129*c2c66affSColin Finck 
130*c2c66affSColin Finck     if (!ld || !message) return WLDAP32_LDAP_PARAM_ERROR;
131*c2c66affSColin Finck 
132*c2c66affSColin Finck     if (oid) {
133*c2c66affSColin Finck         oidU = strWtoU( oid );
134*c2c66affSColin Finck         if (!oidU) goto exit;
135*c2c66affSColin Finck     }
136*c2c66affSColin Finck     if (serverctrls) {
137*c2c66affSColin Finck         serverctrlsU = controlarrayWtoU( serverctrls );
138*c2c66affSColin Finck         if (!serverctrlsU) goto exit;
139*c2c66affSColin Finck     }
140*c2c66affSColin Finck     if (clientctrls) {
141*c2c66affSColin Finck         clientctrlsU = controlarrayWtoU( clientctrls );
142*c2c66affSColin Finck         if (!clientctrlsU) goto exit;
143*c2c66affSColin Finck     }
144*c2c66affSColin Finck 
145*c2c66affSColin Finck     ret = map_error( ldap_extended_operation( ld, oid ? oidU : "", (struct berval *)data,
146*c2c66affSColin Finck                                               serverctrlsU, clientctrlsU, (int *)message ));
147*c2c66affSColin Finck 
148*c2c66affSColin Finck exit:
149*c2c66affSColin Finck     strfreeU( oidU );
150*c2c66affSColin Finck     controlarrayfreeU( serverctrlsU );
151*c2c66affSColin Finck     controlarrayfreeU( clientctrlsU );
152*c2c66affSColin Finck 
153*c2c66affSColin Finck #endif
154*c2c66affSColin Finck     return ret;
155*c2c66affSColin Finck }
156*c2c66affSColin Finck 
157*c2c66affSColin Finck /***********************************************************************
158*c2c66affSColin Finck  *      ldap_extended_operation_sA     (WLDAP32.@)
159*c2c66affSColin Finck  *
160*c2c66affSColin Finck  * See ldap_extended_operation_sW.
161*c2c66affSColin Finck  */
162*c2c66affSColin Finck ULONG CDECL ldap_extended_operation_sA( WLDAP32_LDAP *ld, PCHAR oid, struct WLDAP32_berval *data,
163*c2c66affSColin Finck     PLDAPControlA *serverctrls, PLDAPControlA *clientctrls, PCHAR *retoid,
164*c2c66affSColin Finck     struct WLDAP32_berval **retdata )
165*c2c66affSColin Finck {
166*c2c66affSColin Finck     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
167*c2c66affSColin Finck #ifdef HAVE_LDAP
168*c2c66affSColin Finck     WCHAR *oidW = NULL, *retoidW = NULL;
169*c2c66affSColin Finck     LDAPControlW **serverctrlsW = NULL, **clientctrlsW = NULL;
170*c2c66affSColin Finck 
171*c2c66affSColin Finck     ret = WLDAP32_LDAP_NO_MEMORY;
172*c2c66affSColin Finck 
173*c2c66affSColin Finck     TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_a(oid), data, serverctrls,
174*c2c66affSColin Finck            clientctrls, retoid, retdata );
175*c2c66affSColin Finck 
176*c2c66affSColin Finck     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
177*c2c66affSColin Finck 
178*c2c66affSColin Finck     if (oid) {
179*c2c66affSColin Finck         oidW = strAtoW( oid );
180*c2c66affSColin Finck         if (!oidW) goto exit;
181*c2c66affSColin Finck     }
182*c2c66affSColin Finck     if (serverctrls) {
183*c2c66affSColin Finck         serverctrlsW = controlarrayAtoW( serverctrls );
184*c2c66affSColin Finck         if (!serverctrlsW) goto exit;
185*c2c66affSColin Finck     }
186*c2c66affSColin Finck     if (clientctrls) {
187*c2c66affSColin Finck         clientctrlsW = controlarrayAtoW( clientctrls );
188*c2c66affSColin Finck         if (!clientctrlsW) goto exit;
189*c2c66affSColin Finck     }
190*c2c66affSColin Finck 
191*c2c66affSColin Finck     ret = ldap_extended_operation_sW( ld, oidW, data, serverctrlsW, clientctrlsW,
192*c2c66affSColin Finck                                       &retoidW, retdata );
193*c2c66affSColin Finck 
194*c2c66affSColin Finck     if (retoid && retoidW) {
195*c2c66affSColin Finck         *retoid = strWtoA( retoidW );
196*c2c66affSColin Finck         if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY;
197*c2c66affSColin Finck         ldap_memfreeW( retoidW );
198*c2c66affSColin Finck     }
199*c2c66affSColin Finck 
200*c2c66affSColin Finck exit:
201*c2c66affSColin Finck     strfreeW( oidW );
202*c2c66affSColin Finck     controlarrayfreeW( serverctrlsW );
203*c2c66affSColin Finck     controlarrayfreeW( clientctrlsW );
204*c2c66affSColin Finck 
205*c2c66affSColin Finck #endif
206*c2c66affSColin Finck     return ret;
207*c2c66affSColin Finck }
208*c2c66affSColin Finck 
209*c2c66affSColin Finck /***********************************************************************
210*c2c66affSColin Finck  *      ldap_extended_operation_sW     (WLDAP32.@)
211*c2c66affSColin Finck  *
212*c2c66affSColin Finck  * Perform an extended operation (synchronous mode).
213*c2c66affSColin Finck  *
214*c2c66affSColin Finck  * PARAMS
215*c2c66affSColin Finck  *  ld          [I] Pointer to an LDAP context.
216*c2c66affSColin Finck  *  oid         [I] OID of the extended operation.
217*c2c66affSColin Finck  *  data        [I] Data needed by the operation.
218*c2c66affSColin Finck  *  serverctrls [I] Array of LDAP server controls.
219*c2c66affSColin Finck  *  clientctrls [I] Array of LDAP client controls.
220*c2c66affSColin Finck  *  retoid      [O] OID of the server response message.
221*c2c66affSColin Finck  *  retdata     [O] Data returned by the server.
222*c2c66affSColin Finck  *
223*c2c66affSColin Finck  * RETURNS
224*c2c66affSColin Finck  *  Success: LDAP_SUCCESS
225*c2c66affSColin Finck  *  Failure: An LDAP error code.
226*c2c66affSColin Finck  *
227*c2c66affSColin Finck  * NOTES
228*c2c66affSColin Finck  *  The data parameter should be set to NULL if the operation
229*c2c66affSColin Finck  *  requires no data. The serverctrls, clientctrls, retoid and
230*c2c66affSColin Finck  *  and retdata parameters are also optional. Set to NULL if not
231*c2c66affSColin Finck  *  used. Free retoid and retdata after use with ldap_memfree.
232*c2c66affSColin Finck  */
233*c2c66affSColin Finck ULONG CDECL ldap_extended_operation_sW( WLDAP32_LDAP *ld, PWCHAR oid, struct WLDAP32_berval *data,
234*c2c66affSColin Finck     PLDAPControlW *serverctrls, PLDAPControlW *clientctrls, PWCHAR *retoid,
235*c2c66affSColin Finck     struct WLDAP32_berval **retdata )
236*c2c66affSColin Finck {
237*c2c66affSColin Finck     ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED;
238*c2c66affSColin Finck #ifdef HAVE_LDAP
239*c2c66affSColin Finck     char *oidU = NULL, *retoidU = NULL;
240*c2c66affSColin Finck     LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL;
241*c2c66affSColin Finck 
242*c2c66affSColin Finck     ret = WLDAP32_LDAP_NO_MEMORY;
243*c2c66affSColin Finck 
244*c2c66affSColin Finck     TRACE( "(%p, %s, %p, %p, %p, %p, %p)\n", ld, debugstr_w(oid), data, serverctrls,
245*c2c66affSColin Finck            clientctrls, retoid, retdata );
246*c2c66affSColin Finck 
247*c2c66affSColin Finck     if (!ld) return WLDAP32_LDAP_PARAM_ERROR;
248*c2c66affSColin Finck 
249*c2c66affSColin Finck     if (oid) {
250*c2c66affSColin Finck         oidU = strWtoU( oid );
251*c2c66affSColin Finck         if (!oidU) goto exit;
252*c2c66affSColin Finck     }
253*c2c66affSColin Finck     if (serverctrls) {
254*c2c66affSColin Finck         serverctrlsU = controlarrayWtoU( serverctrls );
255*c2c66affSColin Finck         if (!serverctrlsU) goto exit;
256*c2c66affSColin Finck     }
257*c2c66affSColin Finck     if (clientctrls) {
258*c2c66affSColin Finck         clientctrlsU = controlarrayWtoU( clientctrls );
259*c2c66affSColin Finck         if (!clientctrlsU) goto exit;
260*c2c66affSColin Finck     }
261*c2c66affSColin Finck 
262*c2c66affSColin Finck     ret = map_error( ldap_extended_operation_s( ld, oid ? oidU : "", (struct berval *)data, serverctrlsU,
263*c2c66affSColin Finck                                                 clientctrlsU, &retoidU, (struct berval **)retdata ));
264*c2c66affSColin Finck 
265*c2c66affSColin Finck     if (retoid && retoidU) {
266*c2c66affSColin Finck         *retoid = strUtoW( retoidU );
267*c2c66affSColin Finck         if (!*retoid) ret = WLDAP32_LDAP_NO_MEMORY;
268*c2c66affSColin Finck         ldap_memfree( retoidU );
269*c2c66affSColin Finck     }
270*c2c66affSColin Finck 
271*c2c66affSColin Finck exit:
272*c2c66affSColin Finck     strfreeU( oidU );
273*c2c66affSColin Finck     controlarrayfreeU( serverctrlsU );
274*c2c66affSColin Finck     controlarrayfreeU( clientctrlsU );
275*c2c66affSColin Finck 
276*c2c66affSColin Finck #endif
277*c2c66affSColin Finck     return ret;
278*c2c66affSColin Finck }
279