Home | History | Annotate | Download | only in lib
      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 /* saslint.h - internal SASL library definitions
      8  * Rob Siemborski
      9  * Tim Martin
     10  * $Id: saslint.h,v 1.48 2003/04/16 19:36:01 rjs3 Exp $
     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 SASLINT_H
     53 #define SASLINT_H
     54 
     55 #include <config.h>
     56 #include "sasl.h"
     57 #include "saslplug.h"
     58 #include "saslutil.h"
     59 #include "prop.h"
     60 
     61 /* #define'd constants */
     62 #define CANON_BUF_SIZE 256
     63 
     64 /* Error Handling Foo */
     65 /* Helpful Hints:
     66  *  -Error strings are set as soon as possible (first function in stack trace
     67  *   with a pointer to the sasl_conn_t.
     68  *  -Error codes are set as late as possible (only in the sasl api functions),
     69  *   thoug "as often as possible" also comes to mind to ensure correctness
     70  *  -Errors from calls to _buf_alloc, _sasl_strdup, etc are assumed to be
     71  *   memory errors.
     72  *  -Only errors (error codes < SASL_OK) should be remembered
     73  */
     74 #define RETURN(conn, val) { if(conn && (val) < SASL_OK) \
     75                                (conn)->error_code = (val); \
     76                             return (val); }
     77 #if !defined _SUN_SDK || defined  DEBUG
     78 #define MEMERROR(conn) {\
     79     if(conn) sasl_seterror( (conn), 0, \
     80                    "Out of Memory in " __FILE__ " near line %d", __LINE__ ); \
     81     RETURN(conn, SASL_NOMEM) }
     82 #define PARAMERROR(conn) {\
     83     if(conn) sasl_seterror( (conn), SASL_NOLOG, \
     84                   "Parameter error in " __FILE__ " near line %d", __LINE__ ); \
     85     RETURN(conn, SASL_BADPARAM) }
     86 #define INTERROR(conn, val) {\
     87     if(conn) sasl_seterror( (conn), 0, \
     88                    "Internal Error %d in " __FILE__ " near line %d", (val),\
     89 		   __LINE__ ); \
     90     RETURN(conn, (val)) }
     91 #else
     92 #define MEMERROR(conn) {\
     93     if(conn) _sasl_log((conn), SASL_LOG_WARN, "Out of Memory"); \
     94     RETURN(conn, SASL_NOMEM) }
     95 #define PARAMERROR(conn) {\
     96     if(conn) _sasl_log((conn), SASL_LOG_WARN, "Parameter error"); \
     97     RETURN(conn, SASL_BADPARAM) }
     98 #define INTERROR(conn, val) {\
     99     if(conn) _sasl_log((conn), SASL_LOG_ERR, "Internal Error: %d", (val)); \
    100     RETURN(conn, (val)) }
    101 #endif
    102 
    103 #ifndef PATH_MAX
    104 # ifdef WIN32
    105 #  define PATH_MAX MAX_PATH
    106 # else
    107 #  ifdef _POSIX_PATH_MAX
    108 #   define PATH_MAX _POSIX_PATH_MAX
    109 #  else
    110 #   define PATH_MAX 1024         /* arbitrary; probably big enough will
    111                                   * probably only be 256+64 on
    112                                   * pre-posix machines */
    113 #  endif /* _POSIX_PATH_MAX */
    114 # endif /* WIN32 */
    115 #endif
    116 
    117 /* : Define directory delimiter in SASL_PATH variable */
    118 #ifdef WIN32
    119 #define PATHS_DELIMITER	';'
    120 #else
    121 #define PATHS_DELIMITER	':'
    122 #endif
    123 
    124 /* Datatype Definitions */
    125 typedef struct {
    126   const sasl_callback_t *callbacks;
    127   const char *appname;
    128 #ifdef _SUN_SDK_
    129   struct _sasl_global_context_s *gctx;
    130 #endif /* _SUN_SDK_ */
    131 } sasl_global_callbacks_t;
    132 
    133 typedef struct _sasl_external_properties
    134 {
    135     sasl_ssf_t ssf;
    136     char *auth_id;
    137 } _sasl_external_properties_t;
    138 
    139 typedef struct sasl_string_list
    140 {
    141     const char *d;
    142     struct sasl_string_list *next;
    143 } sasl_string_list_t;
    144 
    145 typedef struct buffer_info
    146 {
    147     char *data;
    148     size_t curlen;
    149     size_t reallen;
    150 } buffer_info_t;
    151 
    152 #ifdef _SUN_SDK_
    153 typedef int add_plugin_t(struct _sasl_global_context_s *gctx,
    154 			const char *, void *);
    155 #else
    156 typedef int add_plugin_t(const char *, void *);
    157 #endif /* _SUN_SDK_ */
    158 
    159 typedef struct add_plugin_list
    160 {
    161     const char *entryname;
    162     add_plugin_t *add_plugin;
    163 } add_plugin_list_t;
    164 
    165 enum Sasl_conn_type { SASL_CONN_UNKNOWN = 0,
    166 		      SASL_CONN_SERVER = 1,
    167                       SASL_CONN_CLIENT = 2 };
    168 
    169 struct sasl_conn {
    170   enum Sasl_conn_type type;
    171 
    172   void (*destroy_conn)(sasl_conn_t *); /* destroy function */
    173 
    174   char *service;
    175 
    176   unsigned int flags;  /* flags passed to sasl_*_new */
    177 
    178   /* IP information.  A buffer of size 52 is adequate for this in its
    179      longest format (see sasl.h) */
    180   int got_ip_local, got_ip_remote;
    181   char iplocalport[NI_MAXHOST + NI_MAXSERV];
    182   char ipremoteport[NI_MAXHOST + NI_MAXSERV];
    183 
    184   void *context;
    185   sasl_out_params_t oparams;
    186 
    187   sasl_security_properties_t props;
    188   _sasl_external_properties_t external;
    189 
    190 #ifndef _SUN_SDK_
    191   sasl_secret_t *secret;
    192 #endif /* !_SUN_SDK_ */
    193 
    194   int (*idle_hook)(sasl_conn_t *conn);
    195   const sasl_callback_t *callbacks;
    196   const sasl_global_callbacks_t *global_callbacks; /* global callbacks
    197 						    * connection */
    198   char *serverFQDN;
    199 
    200   /* Pointers to memory that we are responsible for */
    201   buffer_info_t *encode_buf;
    202 
    203   int error_code;
    204   char *error_buf, *errdetail_buf;
    205   size_t error_buf_len, errdetail_buf_len;
    206   char *mechlist_buf;
    207   size_t mechlist_buf_len;
    208 
    209   char *decode_buf;
    210 
    211   char user_buf[CANON_BUF_SIZE+1], authid_buf[CANON_BUF_SIZE+1];
    212 
    213 #ifdef _SUN_SDK_
    214   struct _sasl_global_context_s *gctx;
    215   /* EXPORT DELETE START */
    216   /* CRYPT DELETE START */
    217 #ifdef _INTEGRATED_SOLARIS_
    218   int sun_reg;
    219 #endif /* _INTEGRATED_SOLARIS_ */
    220   /* CRYPT DELETE END */
    221   /* EXPORT DELETE END */
    222 #endif /* _SUN_SDK_ */
    223 };
    224 
    225 #ifdef _SUN_SDK_
    226 /* track changes in file system */
    227 typedef struct _sasl_path_info {
    228     char *path;
    229     time_t last_changed;
    230     struct _sasl_path_info *next;
    231 } _sasl_path_info_t;
    232 #endif /* _SUN_SDK_ */
    233 
    234 /* Server Conn Type Information */
    235 
    236 typedef struct mechanism
    237 {
    238     int version;
    239     int condition; /* set to SASL_NOUSER if no available users;
    240 		      set to SASL_CONTINUE if delayed plugn loading */
    241     char *plugname; /* for AUTHSOURCE tracking */
    242 #ifdef _SUN_SDK_
    243     /* EXPORT DELETE START */
    244     /* CRYPT DELETE START */
    245 #ifdef _INTEGRATED_SOLARIS_
    246     int sun_reg;
    247 #endif /* _INTEGRATED_SOLARIS_ */
    248     /* CRYPT DELETE END */
    249     /* EXPORT DELETE END */
    250     sasl_server_plug_t *plug;
    251 	/*
    252 	 * The global context needs to be stored with separately from the
    253 	 * the plugin because it will be overwritten when the plugin is
    254 	 * relloaded
    255 	 */
    256     void *glob_context;
    257     struct mechanism *next;
    258 #else
    259     const sasl_server_plug_t *plug;
    260     struct mechanism *next;
    261     char *f;       /* where should i load the mechanism from? */
    262 #endif /* _SUN_SDK_ */
    263 } mechanism_t;
    264 
    265 typedef struct mech_list {
    266   const sasl_utils_t *utils;  /* gotten from plug_init */
    267 
    268   void *mutex;            /* mutex for this data */
    269   mechanism_t *mech_list; /* list of mechanisms */
    270   int mech_length;       /* number of mechanisms */
    271 } mech_list_t;
    272 
    273 typedef struct context_list
    274 {
    275     mechanism_t *mech;
    276     void *context;     /* if NULL, this mech is disabled for this connection
    277 			* otherwise, use this context instead of a call
    278 			* to mech_new */
    279     struct context_list *next;
    280 } context_list_t;
    281 
    282 typedef struct sasl_server_conn {
    283     sasl_conn_t base; /* parts common to server + client */
    284 
    285     char *user_realm; /* domain the user authenticating is in */
    286     int sent_last; /* Have we already done the last send? */
    287     int authenticated;
    288     mechanism_t *mech; /* mechanism trying to use */
    289     sasl_server_params_t *sparams;
    290     context_list_t *mech_contexts;
    291 } sasl_server_conn_t;
    292 
    293 /* Client Conn Type Information */
    294 
    295 typedef struct cmechanism
    296 {
    297     int version;
    298 
    299     char *plugname;
    300 #ifdef _SUN_SDK_
    301     /* EXPORT DELETE START */
    302     /* CRYPT DELETE START */
    303 #ifdef _INTEGRATED_SOLARIS_
    304     int sun_reg;
    305 #endif /* _INTEGRATED_SOLARIS_ */
    306     /* CRYPT DELETE END */
    307     /* EXPORT DELETE END */
    308 	/*
    309 	 * The global context needs to be stored with separately from the
    310 	 * the plugin because it will be overwritten when the plugin is
    311 	 * relloaded
    312 	 */
    313     void *glob_context;
    314     sasl_client_plug_t *plug;
    315 #else
    316     const sasl_client_plug_t *plug;
    317 #endif /* _SUN_SDK_ */
    318 
    319     struct cmechanism *next;
    320 } cmechanism_t;
    321 
    322 typedef struct cmech_list {
    323   const sasl_utils_t *utils;
    324 
    325   void *mutex;            /* mutex for this data */
    326   cmechanism_t *mech_list; /* list of mechanisms */
    327   int mech_length;       /* number of mechanisms */
    328 
    329 } cmech_list_t;
    330 
    331 typedef struct sasl_client_conn {
    332   sasl_conn_t base; /* parts common to server + client */
    333 
    334   cmechanism_t *mech;
    335   sasl_client_params_t *cparams;
    336 
    337   char *clientFQDN;
    338 
    339 } sasl_client_conn_t;
    340 
    341 typedef struct sasl_allocation_utils {
    342   sasl_malloc_t *malloc;
    343   sasl_calloc_t *calloc;
    344   sasl_realloc_t *realloc;
    345   sasl_free_t *free;
    346 } sasl_allocation_utils_t;
    347 
    348 typedef struct sasl_mutex_utils {
    349   sasl_mutex_alloc_t *alloc;
    350   sasl_mutex_lock_t *lock;
    351   sasl_mutex_unlock_t *unlock;
    352   sasl_mutex_free_t *free;
    353 } sasl_mutex_utils_t;
    354 
    355 typedef struct sasl_log_utils_s {
    356   sasl_log_t *log;
    357 } sasl_log_utils_t;
    358 
    359 #ifdef _SUN_SDK_
    360 /*
    361  * The following structure contains the global state for libsasl */
    362 typedef struct _sasl_global_context_s {
    363     int				sasl_server_active;
    364 				/* sasl server init'ed */
    365     mech_list_t			*mechlist;
    366 				/* list of server mechs */
    367     _sasl_path_info_t		*splug_path_info;
    368 				/* path info for server plugins */
    369     sasl_global_callbacks_t	server_global_callbacks;
    370 				/* callbacks for sasl_server_init */
    371     int				(*sasl_server_cleanup_hook)
    372 					(struct _sasl_global_context_s *gctx);
    373 				/* entry point to clean up sasl server */
    374     int				(*sasl_server_idle_hook)(sasl_conn_t *conn);
    375 				/* entry point for sasl server idle */
    376 
    377     cmech_list_t		*cmechlist;
    378 				/* list of client mechs */
    379     _sasl_path_info_t		*cplug_path_info;
    380 				/* path info for client plugins */
    381     sasl_global_callbacks_t	client_global_callbacks;
    382 				/* callbacks for sasl_client_init */
    383     int				sasl_client_active;
    384 				/* sasl client init'ed */
    385     int				(*sasl_client_cleanup_hook)
    386 					(struct _sasl_global_context_s *gctx);
    387 				/* entry point to clean up sasl client */
    388     int				(*sasl_client_idle_hook)(sasl_conn_t *conn);
    389 				/* entry point for sasl client idle */
    390 
    391     const sasl_utils_t		*sasl_server_global_utils;
    392 				/* sasl server global utils */
    393     const sasl_utils_t		*sasl_canonusr_global_utils;
    394 				/* sasl global utils for canonusr plugin */
    395 
    396     void			*configlist;
    397 				/* Configuration key value pair data list */
    398     int				nconfiglist;
    399 				/* number of items in configlist */
    400     char			*config_path;
    401 				/* last read config path */
    402     time_t			config_last_read;
    403 				/* last time config read */
    404 
    405     void			*auxprop_head;
    406 				/* Head of auxprop plugin list */
    407     void			*canonuser_head;
    408 				/* Head of canonusr plugin list */
    409     char			**global_mech_list;
    410 				/* Global list of mechanisms */
    411     void			*free_mutex;
    412 				/* sasl_done()/sasl_dispose() mutex */
    413     sasl_allocation_utils_t     sasl_allocation_utils;
    414 				/* malloc et al */
    415     sasl_mutex_utils_t		sasl_mutex_utils;
    416 				/* mutex_alloc et al */
    417     void			*lib_list_head;
    418 				/* list of dynamic libs opened */
    419 }_sasl_global_context_t;
    420 #endif /* _SUN_SDK_ */
    421 
    422 typedef int sasl_plaintext_verifier(sasl_conn_t *conn,
    423 				    const char *userid,
    424 				    const char *passwd,
    425 				    const char *service,
    426 				    const char *user_realm);
    427 
    428 struct sasl_verify_password_s {
    429     char *name;
    430     sasl_plaintext_verifier *verify;
    431 };
    432 
    433 /*
    434  * globals & constants
    435  */
    436 /*
    437  * common.c
    438  */
    439 #ifndef _SUN_SDK_
    440 LIBSASL_API const sasl_utils_t *sasl_global_utils;
    441 
    442 extern int (*_sasl_client_idle_hook)(sasl_conn_t *conn);
    443 extern int (*_sasl_server_idle_hook)(sasl_conn_t *conn);
    444 
    445 /* These return SASL_OK if we've actually finished cleanup,
    446  * SASL_NOTINIT if that part of the library isn't inited, and
    447  * SASL_CONTINUE if we need to call them again */
    448 extern int (*_sasl_client_cleanup_hook)(void);
    449 extern int (*_sasl_server_cleanup_hook)(void);
    450 
    451 extern sasl_allocation_utils_t _sasl_allocation_utils;
    452 extern sasl_mutex_utils_t _sasl_mutex_utils;
    453 #endif /* !_SUN_SDK_ */
    454 
    455 /*
    456  * checkpw.c
    457  */
    458 extern struct sasl_verify_password_s _sasl_verify_password[];
    459 
    460 /*
    461  * server.c
    462  */
    463 /* (this is a function call to ensure this is read-only to the outside) */
    464 #ifdef _SUN_SDK_
    465 extern int _is_sasl_server_active(_sasl_global_context_t *gctx);
    466 #else
    467 extern int _is_sasl_server_active(void);
    468 #endif /* _SUN_SDK_ */
    469 
    470 /*
    471  * Allocation and Mutex utility macros
    472  */
    473 #ifdef _SUN_SDK_
    474 #define sasl_ALLOC(__size__) (gctx->sasl_allocation_utils.malloc((__size__)))
    475 #define sasl_CALLOC(__nelem__, __size__) \
    476         (gctx->sasl_allocation_utils.calloc((__nelem__), (__size__)))
    477 #define sasl_REALLOC(__ptr__, __size__) \
    478         (gctx->sasl_allocation_utils.realloc((__ptr__), (__size__)))
    479 #define sasl_FREE(__ptr__) (gctx->sasl_allocation_utils.free((__ptr__)))
    480 #define sasl_sun_ALLOC(__size__) (malloc((__size__)))
    481 #define sasl_sun_CALLOC(__nelem__, __size__) (calloc((__nelem__), (__size__)))
    482 #define sasl_sun_REALLOC(__ptr__, __size__) (realloc((__ptr__), (__size__)))
    483 #define sasl_sun_FREE(__ptr__) (free((__ptr__)))
    484 
    485 #define sasl_MUTEX_ALLOC() (gctx->sasl_mutex_utils.alloc())
    486 #define sasl_MUTEX_LOCK(__mutex__) (gctx->sasl_mutex_utils.lock((__mutex__)))
    487 #define sasl_MUTEX_UNLOCK(__mutex__) \
    488 	(gctx->sasl_mutex_utils.unlock((__mutex__)))
    489 #define sasl_MUTEX_FREE(__mutex__) (gctx->sasl_mutex_utils.free((__mutex__)))
    490 #else
    491 #define sasl_ALLOC(__size__) (_sasl_allocation_utils.malloc((__size__)))
    492 #define sasl_CALLOC(__nelem__, __size__) \
    493 	(_sasl_allocation_utils.calloc((__nelem__), (__size__)))
    494 #define sasl_REALLOC(__ptr__, __size__) \
    495 	(_sasl_allocation_utils.realloc((__ptr__), (__size__)))
    496 #define sasl_FREE(__ptr__) (_sasl_allocation_utils.free((__ptr__)))
    497 
    498 #define sasl_MUTEX_ALLOC() (_sasl_mutex_utils.alloc())
    499 #define sasl_MUTEX_LOCK(__mutex__) (_sasl_mutex_utils.lock((__mutex__)))
    500 #define sasl_MUTEX_UNLOCK(__mutex__) (_sasl_mutex_utils.unlock((__mutex__)))
    501 #define sasl_MUTEX_FREE(__mutex__) \
    502 	(_sasl_mutex_utils.free((__mutex__)))
    503 #endif /* _SUN_SDK_ */
    504 
    505 /* function prototypes */
    506 /*
    507  * dlopen.c and staticopen.c
    508  */
    509 /*
    510  * The differences here are:
    511  * _sasl_load_plugins loads all plugins from all files
    512  * _sasl_get_plugin loads the LIBRARY for an individual file
    513  * _sasl_done_with_plugins frees the LIBRARIES loaded by the above 2
    514  * _sasl_locate_entry locates an entrypoint in a given library
    515  */
    516 #ifdef _SUN_SDK_
    517 extern int _sasl_load_plugins(_sasl_global_context_t *gctx,
    518 			      int server,
    519                               const add_plugin_list_t *entrypoints,
    520                               const sasl_callback_t *getpath_callback,
    521                               const sasl_callback_t *verifyfile_callback);
    522 
    523 extern int _sasl_get_plugin(_sasl_global_context_t *gctx,
    524                             const char *file,
    525                             const sasl_callback_t *verifyfile_cb,
    526                             void **libraryptr);
    527 extern int _sasl_locate_entry(void *library, const char *entryname,
    528                               void **entry_point);
    529 extern int _sasl_done_with_plugins(_sasl_global_context_t *gctx);
    530 #else
    531 extern int _sasl_load_plugins(const add_plugin_list_t *entrypoints,
    532 			       const sasl_callback_t *getpath_callback,
    533 			       const sasl_callback_t *verifyfile_callback);
    534 extern int _sasl_get_plugin(const char *file,
    535 			    const sasl_callback_t *verifyfile_cb,
    536 			    void **libraryptr);
    537 extern int _sasl_locate_entry(void *library, const char *entryname,
    538                               void **entry_point);
    539 extern int _sasl_done_with_plugins();
    540 #endif /* _SUN_SDK_ */
    541 
    542 
    543 /*
    544  * common.c
    545  */
    546 extern const sasl_callback_t *
    547 _sasl_find_getpath_callback(const sasl_callback_t *callbacks);
    548 
    549 extern const sasl_callback_t *
    550 _sasl_find_verifyfile_callback(const sasl_callback_t *callbacks);
    551 
    552 #ifdef _SUN_SDK_
    553 extern const sasl_callback_t *
    554 _sasl_find_getconf_callback(const sasl_callback_t *callbacks);
    555 
    556 extern int _sasl_common_init(_sasl_global_context_t *gctx,
    557 			     sasl_global_callbacks_t *global_callbacks,
    558 			     int server);
    559 #else
    560 extern int _sasl_common_init(sasl_global_callbacks_t *global_callbacks);
    561 #endif /* _SUN_SDK_ */
    562 
    563 extern int _sasl_conn_init(sasl_conn_t *conn,
    564 			   const char *service,
    565 			   unsigned int flags,
    566 			   enum Sasl_conn_type type,
    567 			   int (*idle_hook)(sasl_conn_t *conn),
    568 			   const char *serverFQDN,
    569 			   const char *iplocalport,
    570 			   const char *ipremoteport,
    571 			   const sasl_callback_t *callbacks,
    572 			   const sasl_global_callbacks_t *global_callbacks);
    573 extern void _sasl_conn_dispose(sasl_conn_t *conn);
    574 
    575 #ifdef _SUN_SDK_
    576 extern sasl_utils_t *
    577 _sasl_alloc_utils(_sasl_global_context_t *gctx, sasl_conn_t *conn,
    578 		  sasl_global_callbacks_t *global_callbacks);
    579 #else
    580 extern sasl_utils_t *
    581 _sasl_alloc_utils(sasl_conn_t *conn,
    582 		  sasl_global_callbacks_t *global_callbacks);
    583 #endif /* _SUN_SDK_ */
    584 extern int _sasl_free_utils(const sasl_utils_t ** utils);
    585 
    586 extern int
    587 _sasl_getcallback(sasl_conn_t * conn,
    588 		  unsigned long callbackid,
    589 		  int (**pproc)(),
    590 		  void **pcontext);
    591 
    592 extern void
    593 _sasl_log(sasl_conn_t *conn,
    594 	  int level,
    595 	  const char *fmt,
    596 	  ...);
    597 
    598 #ifdef _SUN_SDK_
    599 extern void
    600 __sasl_log(const _sasl_global_context_t *gctx,
    601 	   const sasl_callback_t *callbacks,
    602 	   int level,
    603 	   const char *fmt,
    604 	   ...);
    605 #endif /* _SUN_SDK_ */
    606 void _sasl_get_errorbuf(sasl_conn_t *conn, char ***bufhdl, size_t **lenhdl);
    607 #ifdef _SUN_SDK_
    608 int __sasl_add_string(const _sasl_global_context_t *gctx, char **out,
    609                       size_t *alloclen,
    610                       size_t *outlen, const char *add);
    611 
    612 #define _sasl_add_string(out, alloclen, outlen, add) \
    613 	__sasl_add_string(gctx, out, alloclen, outlen, add)
    614 
    615 /* More Generic Utilities in common.c */
    616 #define _sasl_strdup(in, out, outlen) \
    617 	__sasl_strdup(gctx, in, out, outlen)
    618 extern int __sasl_strdup(const _sasl_global_context_t *gctx, const char *in,
    619                         char **out, size_t *outlen);
    620 
    621 /* Basically a conditional call to realloc(), if we need more */
    622 int __buf_alloc(const _sasl_global_context_t *gctx, char **rwbuf,
    623 	size_t *curlen, size_t newlen);
    624 #define _buf_alloc(rwbuf, curlen, newlen) \
    625 	__buf_alloc(gctx, rwbuf, curlen, newlen)
    626 #else
    627 int _sasl_add_string(char **out, size_t *alloclen,
    628 		     size_t *outlen, const char *add);
    629 
    630 /* More Generic Utilities in common.c */
    631 extern int _sasl_strdup(const char *in, char **out, size_t *outlen);
    632 
    633 /* Basically a conditional call to realloc(), if we need more */
    634 int _buf_alloc(char **rwbuf, size_t *curlen, size_t newlen);
    635 #endif /* _SUN_SDK_ */
    636 
    637 /* convert an iovec to a single buffer */
    638 #ifdef _SUN_SDK_
    639 int _iovec_to_buf(const _sasl_global_context_t *gctx, const struct iovec *vec,
    640                   unsigned numiov, buffer_info_t **output);
    641 #else
    642 int _iovec_to_buf(const struct iovec *vec,
    643 		  unsigned numiov, buffer_info_t **output);
    644 #endif /* _SUN_SDK_ */
    645 
    646 /* Convert between string formats and sockaddr formats */
    647 int _sasl_iptostring(const struct sockaddr *addr, socklen_t addrlen,
    648 		     char *out, unsigned outlen);
    649 int _sasl_ipfromstring(const char *addr, struct sockaddr *out,
    650 		       socklen_t outlen);
    651 
    652 /*
    653  * external plugin (external.c)
    654  */
    655 int external_client_plug_init(const sasl_utils_t *utils,
    656 			      int max_version,
    657 			      int *out_version,
    658 			      sasl_client_plug_t **pluglist,
    659 			      int *plugcount);
    660 int external_server_plug_init(const sasl_utils_t *utils,
    661 			      int max_version,
    662 			      int *out_version,
    663 			      sasl_server_plug_t **pluglist,
    664 			      int *plugcount);
    665 
    666 /* Mech Listing Functions */
    667 #ifdef _SUN_SDK_
    668 int _sasl_build_mechlist(_sasl_global_context_t *gctx);
    669 #else
    670 int _sasl_build_mechlist(void);
    671 #endif /* _SUN_SDK_ */
    672 
    673 int _sasl_server_listmech(sasl_conn_t *conn,
    674 			  const char *user,
    675 			  const char *prefix,
    676 			  const char *sep,
    677 			  const char *suffix,
    678 			  const char **result,
    679 			  unsigned *plen,
    680 			  int *pcount);
    681 int _sasl_client_listmech(sasl_conn_t *conn,
    682 			  const char *prefix,
    683 			  const char *sep,
    684 			  const char *suffix,
    685 			  const char **result,
    686 			  unsigned *plen,
    687 			  int *pcount);
    688 /* Just create a straight list of them */
    689 #ifdef _SUN_SDK_
    690 sasl_string_list_t *_sasl_client_mechs(_sasl_global_context_t *gctx);
    691 sasl_string_list_t *_sasl_server_mechs(_sasl_global_context_t *gctx);
    692 #else
    693 sasl_string_list_t *_sasl_client_mechs(void);
    694 sasl_string_list_t *_sasl_server_mechs(void);
    695 #endif /* _SUN_SDK_ */
    696 
    697 /*
    698  * config file declarations (config.c)
    699  */
    700 #ifdef _SUN_SDK_
    701 extern int sasl_config_init(_sasl_global_context_t *gctx,
    702         const char *filename);
    703 extern void sasl_config_free(_sasl_global_context_t *gctx);
    704 extern const char *sasl_config_getstring(_sasl_global_context_t *gctx,
    705         const char *key,const char *def);
    706 extern int sasl_config_getint(_sasl_global_context_t *gctx,
    707         const char *key,int def);
    708 extern int sasl_config_getswitch(_sasl_global_context_t *gctx,
    709         const char *key,int def);
    710 #else
    711 extern int sasl_config_init(const char *filename);
    712 extern const char *sasl_config_getstring(const char *key,const char *def);
    713 extern int sasl_config_getint(const char *key,int def);
    714 extern int sasl_config_getswitch(const char *key,int def);
    715 #endif /* _SUN_SDK_ */
    716 
    717 /* checkpw.c */
    718 #ifdef DO_SASL_CHECKAPOP
    719 extern int _sasl_auxprop_verify_apop(sasl_conn_t *conn,
    720 				     const char *userstr,
    721 				     const char *challenge,
    722 				     const char *response,
    723 				     const char *user_realm);
    724 #endif /* DO_SASL_CHECKAPOP */
    725 
    726 /* Auxprop Plugin (checkpw.c) */
    727 extern int sasldb_auxprop_plug_init(const sasl_utils_t *utils,
    728 				    int max_version,
    729 				    int *out_version,
    730 				    sasl_auxprop_plug_t **plug,
    731 				    const char *plugname);
    732 
    733 /*
    734  * auxprop.c
    735  */
    736 #ifdef _SUN_SDK_
    737 extern void _sasl_auxprop_free(_sasl_global_context_t *gctx);
    738 #else
    739 extern int _sasl_auxprop_add_plugin(void *p, void *library);
    740 extern void _sasl_auxprop_free(void);
    741 #endif /* _SUN_SDK_ */
    742 extern void _sasl_auxprop_lookup(sasl_server_params_t *sparams,
    743 				 unsigned flags,
    744 				 const char *user, unsigned ulen);
    745 
    746 /*
    747  * canonusr.c
    748  */
    749 #ifdef _SUN_SDK_
    750 void _sasl_canonuser_free(_sasl_global_context_t *gctx);
    751 #else
    752 void _sasl_canonuser_free();
    753 #endif /* _SUN_SDK_ */
    754 extern int internal_canonuser_init(const sasl_utils_t *utils,
    755 				   int max_version,
    756 				   int *out_version,
    757 				   sasl_canonuser_plug_t **plug,
    758 				   const char *plugname);
    759 extern int _sasl_canon_user(sasl_conn_t *conn,
    760 			    const char *user, unsigned ulen,
    761 			    unsigned flags,
    762 			    sasl_out_params_t *oparams);
    763 
    764 #ifdef _SUN_SDK_
    765 /* Private functions to create, free, and use a private context */
    766 void *sasl_create_context(void);
    767 
    768 void sasl_free_context(void *context);
    769 
    770 extern int _sasl_server_init(void *ctx, const sasl_callback_t *callbacks,
    771 		     const char *appname);
    772 
    773 extern int _sasl_server_new(void *ctx, const char *service,
    774 			    const char *serverFQDN, const char *user_realm,
    775 			    const char *iplocalport, const char *ipremoteport,
    776 			    const sasl_callback_t *callbacks, unsigned flags,
    777 			    sasl_conn_t **pconn);
    778 
    779 extern int _sasl_client_init(void *ctx,
    780 			     const sasl_callback_t *callbacks);
    781 
    782 extern int _sasl_client_new(void *ctx,
    783 			    const char *service,
    784 			    const char *serverFQDN,
    785 			    const char *iplocalport,
    786 			    const char *ipremoteport,
    787 			    const sasl_callback_t *prompt_supp,
    788 			    unsigned flags,
    789 			    sasl_conn_t **pconn);
    790 
    791 extern int _sasl_client_add_plugin(void *ctx,
    792                                    const char *plugname,
    793                                    sasl_client_plug_init_t *cplugfunc);
    794 extern int _sasl_server_add_plugin(void *ctx,
    795                                    const char *plugname,
    796                                    sasl_server_plug_init_t *splugfunc);
    797 extern int _sasl_canonuser_add_plugin(void *ctx,
    798                                       const char *plugname,
    799                                       sasl_canonuser_init_t *canonuserfunc);
    800 extern int _sasl_auxprop_add_plugin(void *ctx,
    801                                     const char *plugname,
    802                                     sasl_auxprop_init_t *auxpropfunc);
    803 
    804 _sasl_global_context_t *_sasl_gbl_ctx(void);
    805 
    806 /* EXPORT DELETE START */
    807 /* CRYPT DELETE START */
    808 #ifdef _INTEGRATED_SOLARIS_
    809 int _is_sun_reg(void *mech);
    810 #endif /* _INTEGRATED_SOLARIS_ */
    811 /* CRYPT DELETE END */
    812 /* EXPORT DELETE END */
    813 
    814 /* unsupported functions that are used internally */
    815 int sasl_randcreate(sasl_rand_t **rpool);
    816 
    817 void sasl_randfree(sasl_rand_t **rpool);
    818 
    819 void sasl_rand(sasl_rand_t *rpool, char *buf, unsigned len);
    820 
    821 void sasl_churn(sasl_rand_t *rpool, const char *data, unsigned len);
    822 
    823 int sasl_mkchal(sasl_conn_t *conn, char *buf, unsigned maxlen,
    824 		unsigned hostflag);
    825 #endif	/* _SUN_SDK_ */
    826 
    827 #endif /* SASLINT_H */
    828