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