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@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