Updated license
[anna.git] / include / anna / ldap / ResultCode.hpp
1 // ANNA - Anna is Not Nothingness Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #ifndef anna_ldap_ResultCode_hpp
38 #define anna_ldap_ResultCode_hpp
39
40 #include <string>
41
42 namespace anna {
43
44 namespace ldap {
45
46 class Session;
47
48 /**
49    Modela el resultado de las peticiones enviadas a servidores LDAP.
50
51    \see ldap::Response
52    \see ldap::Session::eventResponse
53 */
54 class ResultCode {
55 public:
56   /**
57      Contructor.
58   */
59   ResultCode() : a_value(0) {;}
60
61   /**
62      Devuelve \em true si la respuesta recibida es correcta o \em false en otro caso.
63      \return \em true si la respuesta recibida es correcta o \em false en otro caso.
64   */
65   bool isOk() const throw() { return a_value == 0; }
66
67   /**
68      Devuelve \em true si la respuesta recibida es un error debido a que las credenciales del usuario
69      no son válidas para conectar al servidor o \em false en otro caso.
70
71      \return  \em true si la respuesta recibida es un error debido a que las credenciales del usuario
72      no son válidas para conectar al servidor o \em false en otro caso.
73
74      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
75      haya retornado \em false.
76   */
77   bool isInvalidCredential() const throw();
78
79   /**
80      Devuelve \em true si la resulta recibida es LDAP_OPERATIONS_ERROR o \em false en otro caso.
81
82      \return  \em true si la resulta recibida es LDAP_OPERATIONS_ERROR o \em false en otro caso.
83
84      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
85      haya retornado \em false.
86   */
87   bool isOperationsError() const throw();
88
89   /**
90      Devuelve \em true si la resulta recibida es LDAP_PROTOCOL_ERROR o \em false en otro caso.
91
92      \return  \em true si la resulta recibida es LDAP_PROTOCOL_ERROR o \em false en otro caso.
93
94      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
95      haya retornado \em false.
96   */
97   bool isProtocolError() const throw();
98
99   /**
100      Devuelve \em true si la resulta recibida es LDAP_TIMELIMIT_EXCEEDED o \em false en otro caso.
101
102      \return  \em true si la resulta recibida es LDAP_TIMELIMIT_EXCEEDED o \em false en otro caso.
103
104      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
105      haya retornado \em false.
106   */
107   bool isTimeLimitExceeded() const throw();
108
109   /**
110      Devuelve \em true si la resulta recibida es LDAP_SIZELIMIT_EXCEEDED o \em false en otro caso.
111
112      \return  \em true si la resulta recibida es LDAP_SIZELIMIT_EXCEEDED o \em false en otro caso.
113
114      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
115      haya retornado \em false.
116   */
117   bool isSizeLimitExceeded() const throw();
118
119   /**
120      Devuelve \em true si la resulta recibida es LDAP_AUTH_METHOD_NOT_SUPPORTED o \em false en otro caso.
121
122      \return  \em true si la resulta recibida es LDAP_AUTH_METHOD_NOT_SUPPORTED o \em false en otro caso.
123
124      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
125      haya retornado \em false.
126   */
127   bool isAuthMethodNotSupported() const throw();
128
129   /**
130      Devuelve \em true si la resulta recibida es LDAP_STRONG_AUTH_REQUIRED o \em false en otro caso.
131
132      \return  \em true si la resulta recibida es LDAP_STRONG_AUTH_REQUIRED o \em false en otro caso.
133
134      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
135      haya retornado \em false.
136   */
137   bool isStrongAuthRequired() const throw();
138
139   /**
140      Devuelve \em true si la resulta recibida es LDAP_SASL_BIND_IN_PROGRESS o \em false en otro caso.
141
142      \return  \em true si la resulta recibida es LDAP_SASL_BIND_IN_PROGRESS o \em false en otro caso.
143
144      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
145      haya retornado \em false.
146   */
147   bool isSASLBindInProgress() const throw();
148
149   /**
150      Devuelve \em true si la resulta recibida es un error de tipo LDAP_ATTR_ERROR o \em false en otro caso,
151      Puede darse al usar atributos no definidos, tipos inapropiados, comparaciones entre tipos no convertibles
152      o errores sintáxticos en general.
153
154      \return \em true si la resulta recibida es un error de tipo LDAP_ATTR_ERROR o \em false en otro caso.
155
156      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
157      haya retornado \em false.
158   */
159   bool isAttrError() const throw();
160
161   /**
162      Devuelve \em true si la resulta recibida es un error de tipo LDAP_NAME_ERROR o \em false en otro caso.
163      Puede dar al usar objetos o alias no definidos o usar una sinstaxis no válida en el DN.
164
165      \return \em true si la resulta recibida es un error de tipo LDAP_NAME_ERROR o \em false en otro caso.
166
167      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
168      haya retornado \em false.
169   */
170   bool isNameError() const throw();
171
172   /**
173      Devuelve \em true si la resulta recibida es un error de tipo LDAP_SECURITY_ERROR o \em false en otro caso.
174      Puede darse por una autorización inapropiada, por presentar una credencial inválida o por intentar acceder
175      a información sin los privilegios suficientes.
176
177      Incluye el valor del método #isInvalidCredential.
178
179      \return \em true si la resulta recibida es un error de tipo LDAP_SECURITY_ERROR o \em false en otro caso.
180
181      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
182      haya retornado \em false.
183   */
184   bool isSecurityError() const throw();
185
186   /**
187      Devuelve \em true si la resulta recibida es un error de tipo LDAP_SERVICE_ERROR o \em false en otro caso.
188      Puede darse cuando el servicio no esté disponible.
189
190      \return \em true si la resulta recibida es un error de tipo LDAP_SERVICE_ERROR o \em false en otro caso.
191
192      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
193      haya retornado \em false.
194   */
195   bool isServiceError() const throw();
196
197   /**
198      Devuelve \em true si la resulta recibida es un error de tipo LDAP_TIMEOUT o \em false en otro caso.
199
200      \return \em true si la resulta recibida es un error de tipo LDAP_TIMEOUT o \em false en otro caso.
201
202      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
203      haya retornado \em false.
204   */
205   bool isTimeout() const throw();
206
207   /**
208      Devuelve \em true si la resulta recibida es un error de tipo LDAP_UNAVAILABLE o \em false en otro caso.
209
210      \return \em true si la resulta recibida es un error de tipo LDAP_UNAVAILABLE o \em false en otro caso.
211
212      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
213      haya retornado \em false.
214   */
215   bool isUnavailable() const throw();
216
217   /**
218      Devuelve \em true si la resulta recibida es un error de tipo LDAP_SERVER_DOWN o \em false en otro caso.
219
220      \return \em true si la resulta recibida es un error de tipo LDAP_SERVER_DOWN o \em false en otro caso.
221
222      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
223      haya retornado \em false.
224   */
225   bool isServerDown() const throw();
226
227   /**
228      Devuelve \em true si la resulta recibida es un error de tipo LDAP_LOCAL_ERROR o \em false en otro caso.
229
230      \return \em true si la resulta recibida es un error de tipo LDAP_LOCAL_ERROR o \em false en otro caso.
231
232      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
233      haya retornado \em false.
234   */
235   bool isLocalError() const throw();
236
237   /**
238      Devuelve \em true si la resulta recibida es un error de tipo LDAP_DECODING_ERROR o \em false en otro caso.
239
240      \return \em true si la resulta recibida es un error de tipo LDAP_DECODING_ERROR o \em false en otro caso.
241
242      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
243      haya retornado \em false.
244   */
245   bool isDecodingError() const throw();
246
247   /**
248      Devuelve \em true si la resulta recibida es un error de tipo LDAP_FILTER_ERROR o \em false en otro caso.
249
250      \return \em true si la resulta recibida es un error de tipo LDAP_FILTER_ERROR o \em false en otro caso.
251
252      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
253      haya retornado \em false.
254   */
255   bool isFilterError() const throw();
256
257   /**
258      Devuelve \em true si la resulta recibida es un error de tipo LDAP_CONNECT_ERROR o \em false en otro caso.
259
260      \return \em true si la resulta recibida es un error de tipo LDAP_CONNECT_ERROR o \em false en otro caso.
261
262      \warning El valor retornado por este método sólo tendrá validez en caso de que  el método #isOk
263      haya retornado \em false.
264   */
265   bool isConnectError() const throw();
266
267   /**
268      Devuelve el codigo de error asociado a esta instancia.
269      \return El codigo de error asociado a esta instancia.
270   */
271   int getValue() const throw() { return a_value; }
272
273   /**
274      Devuelve el texto explicativo del error asociado a esta instancia.
275      \return El texto explicativo del error asociado a esta instancia.
276   */
277   const std::string& getText() const throw() { return a_text; }
278
279   /**
280      Establece el codigo de error asociado a esta instancia.
281      \param value Codigo de error
282   */
283 //   void setValue (const int value) throw () { a_value = value; }
284
285   /**
286      Establece el texto explicativo del error asociado a esta instancia.
287      \param text Texto explicativo del error
288   */
289 //   void setText (const std::string& text) throw () { a_text = text; }
290
291   /**
292      Inicializa el codigo de error y el texto de esta instancia.
293   */
294   void clear() throw() { a_value = 0; a_text.clear(); }
295
296   /**
297      Operador copia.
298      \param other Instancia de la que copiar.
299      \return La instancia de el mismo despues de copiar los valores.
300   */
301   ResultCode& operator= (const ResultCode& other) throw() {
302     a_value = other.a_value;
303     a_text = other.a_text;
304     return *this;
305   }
306
307   /**
308    * Operador de asignación.
309    * \param ldap_result Código de resultado con el que iniciar esta instancia.
310    * \warning Si el valor de \em ldap_result no fue obtenido como resultado de ejecutar alguna operacion LDAP
311    * el resultado de este método no está definido.
312    */
313   ResultCode& operator= (const int ldap_result) throw();
314
315   bool operator == (const int n) const throw() { return a_value == n; }
316   bool operator != (const int n) const throw() { return a_value != n; }
317   bool operator < (const int n) const throw() { return a_value < n; }
318   bool operator <= (const int n) const throw() { return a_value <= n; }
319
320   /**
321      Devuelve una cadena con la informacion relevante sobre esta instancia.
322      \return Una cadena con la informacion relevante sobre esta instancia.
323   */
324   const std::string asString() const throw();
325
326 private:
327   int a_value;
328   std::string a_text;
329
330   ResultCode(const int ldap_method_result);
331
332   void setValue(const int ldap_method_result, const int ldap_method_error) throw();
333
334   bool extractResultCode(const Session*) throw();
335
336   friend class Session;
337 };
338
339 }
340 }
341
342 #endif
343