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