Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 #pragma ident	"%Z%%M%	%I%	%E% SMI"
      6 
      7 /* Generic SASL plugin utility functions
      8  * Rob Siemborski
      9  * $Id: plugin_common.h,v 1.16 2003/04/07 16:03:43 rjs3 Exp $
     10  */
     11 
     12 /*
     13  * Copyright (c) 1998-2003 Carnegie Mellon University.  All rights reserved.
     14  *
     15  * Redistribution and use in source and binary forms, with or without
     16  * modification, are permitted provided that the following conditions
     17  * are met:
     18  *
     19  * 1. Redistributions of source code must retain the above copyright
     20  *    notice, this list of conditions and the following disclaimer.
     21  *
     22  * 2. Redistributions in binary form must reproduce the above copyright
     23  *    notice, this list of conditions and the following disclaimer in
     24  *    the documentation and/or other materials provided with the
     25  *    distribution.
     26  *
     27  * 3. The name "Carnegie Mellon University" must not be used to
     28  *    endorse or promote products derived from this software without
     29  *    prior written permission. For permission or any other legal
     30  *    details, please contact
     31  *      Office of Technology Transfer
     32  *      Carnegie Mellon University
     33  *      5000 Forbes Avenue
     34  *      Pittsburgh, PA  15213-3890
     35  *      (412) 268-4387, fax: (412) 268-7395
     36  *      tech-transfer (at) andrew.cmu.edu
     37  *
     38  * 4. Redistributions of any form whatsoever must retain the following
     39  *    acknowledgment:
     40  *    "This product includes software developed by Computing Services
     41  *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
     42  *
     43  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
     44  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
     45  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
     46  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     47  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
     48  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     49  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     50  */
     51 
     52 #ifndef _PLUGIN_COMMON_H_
     53 #define _PLUGIN_COMMON_H_
     54 
     55 #include <config.h>
     56 
     57 #ifndef macintosh
     58 #ifdef WIN32
     59 # include <winsock.h>
     60 #else
     61 # include <sys/socket.h>
     62 # include <netinet/in.h>
     63 # include <arpa/inet.h>
     64 # include <netdb.h>
     65 #endif /* WIN32 */
     66 #endif /* macintosh */
     67 
     68 #include <sasl.h>
     69 #include <saslutil.h>
     70 #include <saslplug.h>
     71 
     72 #ifdef WIN32
     73 #define PLUG_API __declspec(dllexport)
     74 #else
     75 #define PLUG_API extern
     76 #endif
     77 
     78 #define SASL_CLIENT_PLUG_INIT( x ) \
     79 extern sasl_client_plug_init_t x##_client_plug_init; \
     80 PLUG_API int sasl_client_plug_init(const sasl_utils_t *utils, \
     81                          int maxversion, int *out_version, \
     82 			 sasl_client_plug_t **pluglist, \
     83                          int *plugcount) { \
     84         return x##_client_plug_init(utils, maxversion, out_version, \
     85 				     pluglist, plugcount); \
     86 }
     87 
     88 #define SASL_SERVER_PLUG_INIT( x ) \
     89 extern sasl_server_plug_init_t x##_server_plug_init; \
     90 PLUG_API int sasl_server_plug_init(const sasl_utils_t *utils, \
     91                          int maxversion, int *out_version, \
     92 			 sasl_server_plug_t **pluglist, \
     93                          int *plugcount) { \
     94         return x##_server_plug_init(utils, maxversion, out_version, \
     95 				     pluglist, plugcount); \
     96 }
     97 
     98 #define SASL_AUXPROP_PLUG_INIT( x ) \
     99 extern sasl_auxprop_init_t x##_auxprop_plug_init; \
    100 PLUG_API int sasl_auxprop_plug_init(const sasl_utils_t *utils, \
    101                            int maxversion, int *out_version, \
    102                            sasl_auxprop_plug_t **plug, \
    103                            const char *plugname) {\
    104         return x##_auxprop_plug_init(utils, maxversion, out_version, \
    105                                      plug, plugname); \
    106 }
    107 
    108 #define SASL_CANONUSER_PLUG_INIT( x ) \
    109 extern sasl_canonuser_init_t x##_canonuser_plug_init; \
    110 PLUG_API int sasl_canonuser_init(const sasl_utils_t *utils, \
    111                            int maxversion, int *out_version, \
    112                            sasl_canonuser_plug_t **plug, \
    113                            const char *plugname) {\
    114         return x##_canonuser_plug_init(utils, maxversion, out_version, \
    115                                      plug, plugname); \
    116 }
    117 
    118 /* note: msg cannot include additional variables, so if you want to
    119  * do a printf-format string, then you need to call seterror yourself */
    120 #define SETERROR( utils, msg ) (utils)->seterror( (utils)->conn, 0, (msg) )
    121 
    122 #ifndef MEMERROR
    123 #ifdef _SUN_SDK_
    124 #define MEMERROR( utils ) \
    125     (utils)->seterror( (utils)->conn, 0, "Out of Memory")
    126 #else
    127 #define MEMERROR( utils ) \
    128     (utils)->seterror( (utils)->conn, 0, \
    129                        "Out of Memory in " __FILE__ " near line %d", __LINE__ )
    130 #endif /* _SUN_SDK_ */
    131 #endif
    132 
    133 #ifndef PARAMERROR
    134 #ifdef _SUN_SDK_
    135 #define PARAMERROR( utils ) \
    136     (utils)->seterror( (utils)->conn, 0, "Parameter Error")
    137 #else
    138 #define PARAMERROR( utils ) \
    139     (utils)->seterror( (utils)->conn, 0, \
    140                        "Parameter Error in " __FILE__ " near line %d", __LINE__ )
    141 #endif /* _SUN_SDK_ */
    142 #endif
    143 
    144 #ifndef SASLINT_H
    145 typedef struct buffer_info
    146 {
    147     char *data;
    148     unsigned curlen;   /* Current length of data in buffer */
    149     unsigned reallen;  /* total length of buffer (>= curlen) */
    150 } buffer_info_t;
    151 #endif
    152 
    153 int _plug_ipfromstring(const sasl_utils_t *utils, const char *addr,
    154 		       struct sockaddr *out, socklen_t outlen);
    155 int _plug_iovec_to_buf(const sasl_utils_t *utils, const struct iovec *vec,
    156 		       unsigned numiov, buffer_info_t **output);
    157 int _plug_buf_alloc(const sasl_utils_t *utils, char **rwbuf,
    158 		    unsigned *curlen, unsigned newlen);
    159 int _plug_strdup(const sasl_utils_t * utils, const char *in,
    160 	         char **out, int *outlen);
    161 void _plug_free_string(const sasl_utils_t *utils, char **str);
    162 void _plug_free_secret(const sasl_utils_t *utils, sasl_secret_t **secret);
    163 
    164 #define _plug_get_userid(utils, result, prompt_need) \
    165 	_plug_get_simple(utils, SASL_CB_USER, 0, result, prompt_need)
    166 #define _plug_get_authid(utils, result, prompt_need) \
    167 	_plug_get_simple(utils, SASL_CB_AUTHNAME, 1, result, prompt_need)
    168 int _plug_get_simple(const sasl_utils_t *utils, unsigned int id, int required,
    169 		     const char **result, sasl_interact_t **prompt_need);
    170 
    171 int _plug_get_password(const sasl_utils_t *utils, sasl_secret_t **secret,
    172 		       unsigned int *iscopy, sasl_interact_t **prompt_need);
    173 
    174 int _plug_challenge_prompt(const sasl_utils_t *utils, unsigned int id,
    175 			   const char *challenge, const char *promptstr,
    176 			   const char **result, sasl_interact_t **prompt_need);
    177 
    178 int _plug_get_realm(const sasl_utils_t *utils, const char **availrealms,
    179 		    const char **realm, sasl_interact_t **prompt_need);
    180 
    181 int _plug_make_prompts(const sasl_utils_t *utils,
    182 #ifdef _INTEGRATED_SOLARIS_
    183 		       void **h,
    184 #endif /* _INTEGRATED_SOLARIS_ */
    185 		       sasl_interact_t **prompts_res,
    186 		       const char *user_prompt, const char *user_def,
    187 		       const char *auth_prompt, const char *auth_def,
    188 		       const char *pass_prompt, const char *pass_def,
    189 		       const char *echo_chal,
    190 		       const char *echo_prompt, const char *echo_def,
    191 		       const char *realm_chal,
    192 		       const char *realm_prompt, const char *realm_def);
    193 
    194 int _plug_decode(const sasl_utils_t *utils,
    195 		 void *context,
    196 		 const char *input, unsigned inputlen,
    197 		 char **output, unsigned *outputsize, unsigned *outputlen,
    198 		 int (*decode_pkt)(void *context,
    199 				   const char **input, unsigned *inputlen,
    200 				   char **output, unsigned *outputlen));
    201 
    202 int _plug_parseuser(const sasl_utils_t *utils,
    203 		    char **user, char **realm, const char *user_realm,
    204 		    const char *serverFQDN, const char *input);
    205 
    206 #ifdef _INTEGRATED_SOLARIS_
    207 /* EXPORT DELETE START */
    208 /* CRYPT DELETE START */
    209 typedef void reg_sun_t(void *);
    210 
    211 #define REG_PLUG( X, Y ) { \
    212 	reg_sun_t *func = NULL; \
    213 	unsigned int l; \
    214 	utils->getopt(utils->getopt_context, X, "reg_sun_plug", \
    215 		(const char **)&func, &l); \
    216 	if (func != NULL && l == 0) \
    217 		(*func)(Y); \
    218 }
    219 /* CRYPT DELETE END */
    220 /* EXPORT DELETE END */
    221 
    222 int use_locale(const char *lang_list, int is_client);
    223 const char *convert_prompt(const sasl_utils_t *utils, void **h, const char *s);
    224 char *local_to_utf(const sasl_utils_t *utils, const char *s);
    225 #endif /* _INTEGRATED_SOLARIS_ */
    226 #endif /* _PLUGIN_COMMON_H_ */
    227