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 "winuser.h" 32 #include "winnls.h" 33 34 #include "winldap_private.h" 35 #include "wldap32.h" 36 #include "wine/debug.h" 37 38 WINE_DEFAULT_DEBUG_CHANNEL(wldap32); 39 40 ULONG map_error( int error ) 41 { 42 switch (error) 43 { 44 #ifdef HAVE_LDAP_H 45 case LDAP_SERVER_DOWN: return WLDAP32_LDAP_SERVER_DOWN; 46 case LDAP_LOCAL_ERROR: return WLDAP32_LDAP_LOCAL_ERROR; 47 case LDAP_DECODING_ERROR: return WLDAP32_LDAP_DECODING_ERROR; 48 case LDAP_TIMEOUT: return WLDAP32_LDAP_TIMEOUT; 49 case LDAP_AUTH_UNKNOWN: return WLDAP32_LDAP_AUTH_UNKNOWN; 50 case LDAP_FILTER_ERROR: return WLDAP32_LDAP_FILTER_ERROR; 51 case LDAP_USER_CANCELLED: return WLDAP32_LDAP_USER_CANCELLED; 52 case LDAP_PARAM_ERROR: return WLDAP32_LDAP_PARAM_ERROR; 53 case LDAP_NO_MEMORY: return WLDAP32_LDAP_NO_MEMORY; 54 case LDAP_CONNECT_ERROR: return WLDAP32_LDAP_CONNECT_ERROR; 55 case LDAP_NOT_SUPPORTED: return WLDAP32_LDAP_NOT_SUPPORTED; 56 case LDAP_CONTROL_NOT_FOUND: return WLDAP32_LDAP_CONTROL_NOT_FOUND; 57 case LDAP_NO_RESULTS_RETURNED: return WLDAP32_LDAP_NO_RESULTS_RETURNED; 58 case LDAP_MORE_RESULTS_TO_RETURN: return WLDAP32_LDAP_MORE_RESULTS_TO_RETURN; 59 case LDAP_CLIENT_LOOP: return WLDAP32_LDAP_CLIENT_LOOP; 60 case LDAP_REFERRAL_LIMIT_EXCEEDED: return WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED; 61 #endif 62 default: return error; 63 } 64 } 65 66 /*********************************************************************** 67 * ldap_err2stringA (WLDAP32.@) 68 * 69 * See ldap_err2stringW. 70 */ 71 PCHAR CDECL ldap_err2stringA( ULONG err ) 72 { 73 static char buf[256] = ""; 74 75 TRACE( "(0x%08x)\n", err ); 76 77 if (err <= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED) 78 LoadStringA( hwldap32, err, buf, 256 ); 79 else 80 LoadStringA( hwldap32, WLDAP32_LDAP_LOCAL_ERROR, buf, 256 ); 81 82 return buf; 83 } 84 85 /*********************************************************************** 86 * ldap_err2stringW (WLDAP32.@) 87 * 88 * Convert an error code into a string describing the error. 89 * 90 * PARAMS 91 * err [I] Error code to convert. 92 * 93 * RETURNS 94 * Success: Pointer to a string containing the error description. 95 * Failure: NULL 96 * 97 * NOTES 98 * The returned string is statically allocated, you must not 99 * free this string. 100 */ 101 PWCHAR CDECL ldap_err2stringW( ULONG err ) 102 { 103 static WCHAR buf[256] = { 0 }; 104 105 TRACE( "(0x%08x)\n", err ); 106 107 if (err <= WLDAP32_LDAP_REFERRAL_LIMIT_EXCEEDED) 108 LoadStringW( hwldap32, err, buf, 256 ); 109 else 110 LoadStringW( hwldap32, WLDAP32_LDAP_LOCAL_ERROR, buf, 256 ); 111 112 return buf; 113 } 114 115 /*********************************************************************** 116 * ldap_perror (WLDAP32.@) 117 * 118 * Print a given error string. 119 * 120 * PARAMS 121 * ld [I] Pointer to an LDAP context. 122 * msg [I] Error string. 123 * 124 * RETURNS 125 * Nothing. 126 * 127 * NOTES 128 * Like native, this function does nothing. 129 */ 130 void CDECL WLDAP32_ldap_perror( WLDAP32_LDAP *ld, const PCHAR msg ) 131 { 132 TRACE( "(%p, %s)\n", ld, debugstr_a(msg) ); 133 } 134 135 /*********************************************************************** 136 * ldap_result2error (WLDAP32.@) 137 * 138 * Parse an LDAP message and return the error obtained from it. 139 * 140 * PARAMS 141 * ld [I] Pointer to an LDAP context. 142 * res [I] Pointer to an LDAPMessage structure. 143 * free [I] Ask for the LDAPMessage structure to be freed. 144 * 145 * RETURNS 146 * Success: LDAP_SUCCESS 147 * Failure: An LDAP error code. 148 * 149 * NOTES 150 * If not asked for, use ldap_msgfree to free the LDAPMessage. 151 */ 152 ULONG CDECL WLDAP32_ldap_result2error( WLDAP32_LDAP *ld, WLDAP32_LDAPMessage *res, ULONG free ) 153 { 154 ULONG ret = WLDAP32_LDAP_NOT_SUPPORTED; 155 #ifdef HAVE_LDAP 156 int error; 157 158 TRACE( "(%p, %p, 0x%08x)\n", ld, res, free ); 159 160 if (!ld || !res) return ~0u; 161 162 ret = ldap_parse_result( ld, res, &error, NULL, NULL, NULL, NULL, free ); 163 164 if (ret == LDAP_SUCCESS) 165 ret = error; 166 else 167 ret = ~0u; 168 169 #endif 170 return ret; 171 } 172 173 /*********************************************************************** 174 * LdapGetLastError (WLDAP32.@) 175 * 176 * Return the last error set by an LDAP function call. 177 * 178 * PARAMS 179 * None. 180 * 181 * RETURNS 182 * An LDAP error code. 183 */ 184 ULONG CDECL LdapGetLastError( void ) 185 { 186 TRACE( "\n" ); 187 return GetLastError(); 188 } 189 190 static const ULONG WLDAP32_errormap[] = { 191 /* LDAP_SUCCESS */ ERROR_SUCCESS, 192 /* LDAP_OPERATIONS_ERROR */ ERROR_OPEN_FAILED, 193 /* LDAP_PROTOCOL_ERROR */ ERROR_INVALID_LEVEL, 194 /* LDAP_TIMELIMIT_EXCEEDED */ ERROR_TIMEOUT, 195 /* LDAP_SIZELIMIT_EXCEEDED */ ERROR_MORE_DATA, 196 /* LDAP_COMPARE_FALSE */ ERROR_DS_GENERIC_ERROR, 197 /* LDAP_COMPARE_TRUE */ ERROR_DS_GENERIC_ERROR, 198 /* LDAP_AUTH_METHOD_NOT_SUPPORTED */ ERROR_ACCESS_DENIED, 199 /* LDAP_STRONG_AUTH_REQUIRED */ ERROR_ACCESS_DENIED, 200 /* LDAP_REFERRAL_V2 */ ERROR_MORE_DATA, 201 /* LDAP_REFERRAL */ ERROR_MORE_DATA, 202 /* LDAP_ADMIN_LIMIT_EXCEEDED */ ERROR_NOT_ENOUGH_QUOTA, 203 /* LDAP_UNAVAILABLE_CRIT_EXTENSION */ ERROR_CAN_NOT_COMPLETE, 204 /* LDAP_CONFIDENTIALITY_REQUIRED */ ERROR_DS_GENERIC_ERROR, 205 /* LDAP_SASL_BIND_IN_PROGRESS */ ERROR_DS_GENERIC_ERROR, 206 /* 0x0f */ ERROR_DS_GENERIC_ERROR, 207 /* LDAP_NO_SUCH_ATTRIBUTE */ ERROR_INVALID_PARAMETER, 208 /* LDAP_UNDEFINED_TYPE */ ERROR_DS_GENERIC_ERROR, 209 /* LDAP_INAPPROPRIATE_MATCHING */ ERROR_INVALID_PARAMETER, 210 /* LDAP_CONSTRAINT_VIOLATION */ ERROR_INVALID_PARAMETER, 211 /* LDAP_ATTRIBUTE_OR_VALUE_EXISTS */ ERROR_ALREADY_EXISTS, 212 /* LDAP_INVALID_SYNTAX */ ERROR_INVALID_NAME, 213 /* 0x16 */ ERROR_DS_GENERIC_ERROR, 214 /* 0x17 */ ERROR_DS_GENERIC_ERROR, 215 /* 0x18 */ ERROR_DS_GENERIC_ERROR, 216 /* 0x19 */ ERROR_DS_GENERIC_ERROR, 217 /* 0x1a */ ERROR_DS_GENERIC_ERROR, 218 /* 0x1b */ ERROR_DS_GENERIC_ERROR, 219 /* 0x1c */ ERROR_DS_GENERIC_ERROR, 220 /* 0x1d */ ERROR_DS_GENERIC_ERROR, 221 /* 0x1e */ ERROR_DS_GENERIC_ERROR, 222 /* 0x1f */ ERROR_DS_GENERIC_ERROR, 223 /* LDAP_NO_SUCH_OBJECT */ ERROR_FILE_NOT_FOUND, 224 /* LDAP_ALIAS_PROBLEM */ ERROR_DS_GENERIC_ERROR, 225 /* LDAP_INVALID_DN_SYNTAX */ ERROR_INVALID_PARAMETER, 226 /* LDAP_IS_LEAF */ ERROR_DS_GENERIC_ERROR, 227 /* LDAP_ALIAS_DEREF_PROBLEM */ ERROR_DS_GENERIC_ERROR, 228 /* 0x25 */ ERROR_DS_GENERIC_ERROR, 229 /* 0x26 */ ERROR_DS_GENERIC_ERROR, 230 /* 0x27 */ ERROR_DS_GENERIC_ERROR, 231 /* 0x28 */ ERROR_DS_GENERIC_ERROR, 232 /* 0x29 */ ERROR_DS_GENERIC_ERROR, 233 /* 0x2a */ ERROR_DS_GENERIC_ERROR, 234 /* 0x2b */ ERROR_DS_GENERIC_ERROR, 235 /* 0x2c */ ERROR_DS_GENERIC_ERROR, 236 /* 0x2d */ ERROR_DS_GENERIC_ERROR, 237 /* 0x2e */ ERROR_DS_GENERIC_ERROR, 238 /* 0x2f */ ERROR_DS_GENERIC_ERROR, 239 /* LDAP_INAPPROPRIATE_AUTH */ ERROR_ACCESS_DENIED, 240 /* LDAP_INVALID_CREDENTIALS */ ERROR_WRONG_PASSWORD, 241 /* LDAP_INSUFFICIENT_RIGHTS */ ERROR_ACCESS_DENIED, 242 /* LDAP_BUSY */ ERROR_BUSY, 243 /* LDAP_UNAVAILABLE */ ERROR_DEV_NOT_EXIST, 244 /* LDAP_UNWILLING_TO_PERFORM */ ERROR_CAN_NOT_COMPLETE, 245 /* LDAP_LOOP_DETECT */ ERROR_DS_GENERIC_ERROR, 246 /* 0x37 */ ERROR_DS_GENERIC_ERROR, 247 /* 0x38 */ ERROR_DS_GENERIC_ERROR, 248 /* 0x39 */ ERROR_DS_GENERIC_ERROR, 249 /* 0x3a */ ERROR_DS_GENERIC_ERROR, 250 /* 0x3b */ ERROR_DS_GENERIC_ERROR, 251 /* LDAP_SORT_CONTROL_MISSING */ 8261, 252 /* LDAP_OFFSET_RANGE_ERROR */ 8262, 253 /* 0x3e */ ERROR_DS_GENERIC_ERROR, 254 /* 0x3f */ ERROR_DS_GENERIC_ERROR, 255 /* LDAP_NAMING_VIOLATION */ ERROR_INVALID_PARAMETER, 256 /* LDAP_OBJECT_CLASS_VIOLATION */ ERROR_INVALID_PARAMETER, 257 /* LDAP_NOT_ALLOWED_ON_NONLEAF */ ERROR_CAN_NOT_COMPLETE, 258 /* LDAP_NOT_ALLOWED_ON_RDN */ ERROR_ACCESS_DENIED, 259 /* LDAP_ALREADY_EXISTS */ ERROR_ALREADY_EXISTS, 260 /* LDAP_NO_OBJECT_CLASS_MODS */ ERROR_ACCESS_DENIED, 261 /* LDAP_RESULTS_TOO_LARGE */ ERROR_INSUFFICIENT_BUFFER, 262 /* LDAP_AFFECTS_MULTIPLE_DSAS */ ERROR_CAN_NOT_COMPLETE, 263 /* 0x48 */ ERROR_DS_GENERIC_ERROR, 264 /* 0x49 */ ERROR_DS_GENERIC_ERROR, 265 /* 0x4a */ ERROR_DS_GENERIC_ERROR, 266 /* 0x4b */ ERROR_DS_GENERIC_ERROR, 267 /* LDAP_VIRTUAL_LIST_VIEW_ERROR */ ERROR_DS_GENERIC_ERROR, 268 /* 0x4d */ ERROR_DS_GENERIC_ERROR, 269 /* 0x4e */ ERROR_DS_GENERIC_ERROR, 270 /* 0x4f */ ERROR_DS_GENERIC_ERROR, 271 /* LDAP_OTHER */ ERROR_DS_GENERIC_ERROR, 272 /* LDAP_SERVER_DOWN */ ERROR_BAD_NET_RESP, 273 /* LDAP_LOCAL_ERROR */ ERROR_DS_GENERIC_ERROR, 274 /* LDAP_ENCODING_ERROR */ ERROR_UNEXP_NET_ERR, 275 /* LDAP_DECODING_ERROR */ ERROR_UNEXP_NET_ERR, 276 /* LDAP_TIMEOUT */ ERROR_SERVICE_REQUEST_TIMEOUT, 277 /* LDAP_AUTH_UNKNOWN */ ERROR_WRONG_PASSWORD, 278 /* LDAP_FILTER_ERROR */ ERROR_INVALID_PARAMETER, 279 /* LDAP_USER_CANCELLED */ ERROR_CANCELLED, 280 /* LDAP_PARAM_ERROR */ ERROR_INVALID_PARAMETER, 281 /* LDAP_NO_MEMORY */ ERROR_NOT_ENOUGH_MEMORY, 282 /* LDAP_CONNECT_ERROR */ ERROR_CONNECTION_REFUSED, 283 /* LDAP_NOT_SUPPORTED */ ERROR_CAN_NOT_COMPLETE, 284 /* LDAP_CONTROL_NOT_FOUND */ ERROR_NOT_FOUND, 285 /* LDAP_NO_RESULTS_RETURNED */ ERROR_MORE_DATA, 286 /* LDAP_MORE_RESULTS_TO_RETURN */ ERROR_MORE_DATA, 287 /* LDAP_CLIENT_LOOP */ ERROR_DS_GENERIC_ERROR, 288 /* LDAP_REFERRAL_LIMIT_EXCEEDED */ ERROR_DS_GENERIC_ERROR 289 }; 290 291 /*********************************************************************** 292 * LdapMapErrorToWin32 (WLDAP32.@) 293 * 294 * Map an LDAP error code to a Win32 error code. 295 * 296 * PARAMS 297 * err [I] An LDAP error code. 298 * 299 * RETURNS 300 * A Win32 error code. 301 */ 302 ULONG CDECL LdapMapErrorToWin32( ULONG err ) 303 { 304 TRACE( "(0x%08x)\n", err ); 305 306 if (err >= sizeof(WLDAP32_errormap)/sizeof(WLDAP32_errormap[0])) 307 return ERROR_DS_GENERIC_ERROR; 308 return WLDAP32_errormap[err]; 309 } 310