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