1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 27 #ifndef _NS_INTERNAL_H 28 #define _NS_INTERNAL_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 #include <stdio.h> 35 #include <sys/types.h> 36 #include <sys/time.h> 37 #include <thread.h> 38 #include <lber.h> 39 #include <ldap.h> 40 #include "ns_sldap.h" 41 #include "ns_cache_door.h" 42 43 /* 44 * INTERNALLY USED CONSTANTS 45 */ 46 47 #define MAXERROR 2000 48 #define TRUE 1 49 #define FALSE 0 50 #define NSLDAPDIRECTORY "/var/ldap" 51 #define NSCONFIGFILE "/var/ldap/ldap_client_file" 52 #define NSCONFIGREFRESH "/var/ldap/ldap_client_file.refresh" 53 #define NSCREDFILE "/var/ldap/ldap_client_cred" 54 #define NSCREDREFRESH "/var/ldap/ldap_client_cred.refresh" 55 #define ROTORSIZE 256 56 #define MASK 0377 57 #define LDAPMAXHARDLOOKUPTIME 256 58 #define DONOTEDIT \ 59 "Do not edit this file manually; your changes will be lost." \ 60 "Please use ldapclient (1M) instead." 61 #define MAXPORTNUMBER 65535 62 #define MAXPORTNUMBER_STR "65535" 63 #define CREDFILE 0 64 #define CONFIGFILE 1 65 #define UIDNUMFILTER "(&(objectclass=posixAccount)(uidnumber=%s))" 66 #define UIDNUMFILTER_SSD "(&(%%s)(uidnumber=%s))" 67 #define UIDFILTER "(&(objectclass=posixAccount)(uid=%s))" 68 #define UIDFILTER_SSD "(&(%%s)(uid=%s))" 69 #define HOSTFILTER "(&(objectclass=ipHost)(cn=%s))" 70 #define HOSTFILTER_SSD "(&(%%s)(cn=%s))" 71 72 #define SIMPLEPAGECTRLFLAG 1 73 #define VLVCTRLFLAG 2 74 75 #define LISTPAGESIZE 1000 76 #define ENUMPAGESIZE 100 77 #define SORTKEYLIST "cn uid" 78 79 #define DEFMAX 8 80 #define TOKENSEPARATOR '=' 81 #define QUOTETOK '"' 82 #define SPACETOK ' ' 83 #define COMMATOK ',' 84 #define COLONTOK ':' 85 #define QUESTTOK '?' 86 #define SEMITOK ';' 87 #define TABTOK '\t' 88 #define OPARATOK '(' 89 #define CPARATOK ')' 90 #define BSLTOK '\\' 91 #define DOORLINESEP "\07" 92 #define DOORLINESEP_CHR 0x7 93 #define COMMASEP ", " 94 #define SPACESEP " " 95 #define SEMISEP ";" 96 #define COLONSEP ":" 97 #define COLSPSEP ": " 98 #define EQUALSEP "=" 99 #define EQUSPSEP "= " 100 #define LAST_VALUE (int)NS_LDAP_HOST_CERTPATH_P 101 #define BUFSIZE 1024 102 #define DEFAULTCONFIGNAME "__default_config" 103 #define EXP_DEFAULT_TTL "43200" /* 12 hours TTL */ 104 #define CRYPTMARK "{NS1}" 105 #define DOORBUFFERSIZE 8192 106 107 #define LDIF_FMT_STR "%s: %s" 108 #define FILE_FMT_STR "%s= %s" 109 #define DOOR_FMT_STR "%s=%s" 110 111 #define SESSION_CACHE_INC 8 112 #define CONID_OFFSET 1024 113 #define NS_DEFAULT_BIND_TIMEOUT 30 /* timeout value in seconds */ 114 #define NS_DEFAULT_SEARCH_TIMEOUT 30 /* timeout value in seconds */ 115 116 /* max rdn length in conversion routines used by __ns_ldap_addTypedEntry() */ 117 #define RDNSIZE 512 118 119 /* 120 * special service used by ldap_cachemgr to indicate a shadow update 121 * is to be done with the credential of the administrator identity 122 */ 123 #define NS_ADMIN_SHADOW_UPDATE "shadow__admin_update" 124 125 /* Phase 1 profile information */ 126 #define _PROFILE1_OBJECTCLASS "SolarisNamingProfile" 127 #define _PROFILE_CONTAINER "profile" 128 #define _PROFILE_FILTER "(&(|(objectclass=%s)(objectclass=%s))(cn=%s))" 129 130 /* Phase 2 profile information */ 131 #define _PROFILE2_OBJECTCLASS "DUAConfigProfile" 132 133 /* Common to all profiles */ 134 #define _P_CN "cn" 135 136 /* Native LDAP Phase 1 Specific Profile Attributes */ 137 #define _P1_SERVERS "SolarisLDAPServers" 138 #define _P1_SEARCHBASEDN "SolarisSearchBaseDN" 139 #define _P1_CACHETTL "SolarisCacheTTL" 140 #define _P1_BINDDN "SolarisBindDN" 141 #define _P1_BINDPASSWORD "SolarisBindPassword" 142 #define _P1_AUTHMETHOD "SolarisAuthMethod" 143 #define _P1_TRANSPORTSECURITY "SolarisTransportSecurity" 144 #define _P1_CERTIFICATEPATH "SolarisCertificatePath" 145 #define _P1_CERTIFICATEPASSWORD "SolarisCertificatePassword" 146 #define _P1_DATASEARCHDN "SolarisDataSearchDN" 147 #define _P1_SEARCHSCOPE "SolarisSearchScope" 148 #define _P1_SEARCHTIMELIMIT "SolarisSearchTimeLimit" 149 #define _P1_PREFERREDSERVER "SolarisPreferredServer" 150 #define _P1_PREFERREDSERVERONLY "SolarisPreferredServerOnly" 151 #define _P1_SEARCHREFERRAL "SolarisSearchReferral" 152 #define _P1_BINDTIMELIMIT "SolarisBindTimeLimit" 153 154 /* Native LDAP Phase 2 Specific Profile Attributes */ 155 #define _P2_PREFERREDSERVER "preferredServerList" 156 #define _P2_DEFAULTSERVER "defaultServerList" 157 #define _P2_SEARCHBASEDN "defaultSearchBase" 158 #define _P2_SEARCHSCOPE "defaultSearchScope" 159 #define _P2_AUTHMETHOD "authenticationMethod" 160 #define _P2_CREDENTIALLEVEL "credentialLevel" 161 #define _P2_SERVICESEARCHDESC "serviceSearchDescriptor" 162 #define _P2_SEARCHTIMELIMIT "searchTimeLimit" 163 #define _P2_BINDTIMELIMIT "bindTimeLimit" 164 #define _P2_FOLLOWREFERRALS "followReferrals" 165 #define _P2_PROFILETTL "profileTTL" 166 #define _P2_ATTRIBUTEMAP "attributeMap" 167 #define _P2_OBJECTCLASSMAP "objectClassMap" 168 #define _P2_SERVICECREDLEVEL "serviceCredentialLevel" 169 #define _P2_SERVICEAUTHMETHOD "serviceAuthenticationMethod" 170 171 /* Control & SASL information from RootDSE door call */ 172 #define _SASLMECHANISM "supportedSASLmechanisms" 173 #define _SASLMECHANISM_LEN 23 174 #define _SUPPORTEDCONTROL "supportedControl" 175 #define _SUPPORTEDCONTROL_LEN 16 176 177 #define NS_HASH_MAX 257 178 #define NS_HASH_SCHEMA_MAPPING_EXISTED "=MAPPING EXISTED=" 179 #define NS_HASH_RC_SUCCESS 1 180 #define NS_HASH_RC_NO_MEMORY -1 181 #define NS_HASH_RC_CONFIG_ERROR -2 182 #define NS_HASH_RC_EXISTED -3 183 #define NS_HASH_RC_SYNTAX_ERROR -4 184 185 /* Password management related error message from iDS ldap server */ 186 #define NS_PWDERR_MAXTRIES \ 187 "Exceed password retry limit." 188 #define NS_PWDERR_EXPIRED \ 189 "password expired!" 190 #define NS_PWDERR_ACCT_INACTIVATED \ 191 "Account inactivated. Contact system administrator." 192 #define NS_PWDERR_CHANGE_NOT_ALLOW \ 193 "user is not allowed to change password" 194 #define NS_PWDERR_INVALID_SYNTAX \ 195 "invalid password syntax" 196 #define NS_PWDERR_TRIVIAL_PASSWD \ 197 "Password failed triviality check" 198 #define NS_PWDERR_IN_HISTORY \ 199 "password in history" 200 #define NS_PWDERR_WITHIN_MIN_AGE \ 201 "within password minimum age" 202 203 /* 204 * INTERNALLY USED MACROS 205 */ 206 207 void __s_api_debug_pause(int priority, int st, const char *mesg); 208 209 #define NULL_OR_STR(str) (!(str) || *(str) == '\0' ? "<NULL>" : (str)) 210 211 /* 212 * MKERROR: builds the error structure and fills in the status and 213 * the message. The message must be a freeable (non-static) string. 214 * If it fails to allocate memory for the error structure, 215 * it will return the retErr. 216 */ 217 #define MKERROR(priority, err, st, mesg, retErr) \ 218 if (((err) = calloc(1, sizeof (struct ns_ldap_error))) == NULL) \ 219 return (retErr); \ 220 (err)->message = mesg; \ 221 (err)->status = (st); \ 222 __s_api_debug_pause(priority, st, (err)->message); 223 224 /* 225 * MKERROR_PWD_MGMT is almost the same as MKERROR 226 * except that it takes two more inputs to fill in the 227 * password management information part of the 228 * ns_ldap_error structure pointed to by err, 229 * and it does not log a syslog message. 230 */ 231 #define MKERROR_PWD_MGMT(err, st, mesg, pwd_status, sec_until_exp, retErr) \ 232 if (((err) = calloc(1, sizeof (struct ns_ldap_error))) == NULL) \ 233 return (retErr); \ 234 (err)->message = mesg; \ 235 (err)->status = (st); \ 236 (err)->pwd_mgmt.status = (pwd_status); \ 237 (err)->pwd_mgmt.sec_until_expired = (sec_until_exp); 238 239 #ifdef DEBUG 240 #define NSLDAPTRACE(variable, setequal, message) \ 241 if (variable > 0 || ((setequal != 0) && (variable == setequal))) { \ 242 char buf[BUFSIZ]; \ 243 (void) snprintf(buf, BUFSIZ, message); \ 244 (void) write(__ldap_debug_file, buf); \ 245 } 246 #endif 247 248 /* 249 * INTERNAL DATA STRUCTURES 250 */ 251 252 /* 253 * configuration entry type 254 */ 255 256 typedef enum { 257 SERVERCONFIG = 1, 258 CLIENTCONFIG = 2, 259 CREDCONFIG = 3 260 } ns_conftype_t; 261 262 /* 263 * datatype of a config entry 264 */ 265 266 typedef enum { 267 NS_UNKNOWN = 0, 268 CHARPTR = 1, /* Single character pointer */ 269 ARRAYCP = 2, /* comma sep array of char pointers */ 270 ARRAYAUTH = 3, /* Array of auths */ 271 TIMET = 4, /* time relative value (TTL) */ 272 INT = 5, /* single integer */ 273 SSDLIST = 6, /* service search descriptor */ 274 ATTRMAP = 7, /* attribute mapping */ 275 OBJMAP = 8, /* objectclass mapping */ 276 SERVLIST = 9, /* serverlist (SP sep array) */ 277 ARRAYCRED = 10, /* Array of credentialLevels */ 278 SAMLIST = 11, /* serviceAuthenticationMethod */ 279 SCLLIST = 12 /* serviceCredentialLevel */ 280 } ns_datatype_t; 281 282 typedef enum { 283 NS_SUCCESS, 284 NS_NOTFOUND, 285 NS_PARSE_ERR 286 } ns_parse_status; 287 288 typedef enum { 289 NS_DOOR_FMT = 1, 290 NS_LDIF_FMT = 2, 291 NS_FILE_FMT = 3 292 } ns_strfmt_t; 293 294 /* 295 * This enum reduces the number of version string compares 296 * against NS_LDAP_VERSION_1 and NS_LDAP_VERSION_2 297 */ 298 299 typedef enum { 300 NS_LDAP_V1 = 1000, 301 NS_LDAP_V2 = 2000 302 } ns_version_t; 303 304 /* 305 * enum<->string mapping construct 306 */ 307 308 typedef struct ns_enum_map { 309 int value; 310 char *name; 311 } ns_enum_map; 312 313 #define ENUM2INT(x) ((int)(x)) 314 315 #define INT2PARAMINDEXENUM(x) ((ParamIndexType)(x)) 316 #define INT2SEARCHREFENUM(x) ((SearchRef_t)(x)) 317 #define INT2SCOPEENUM(x) ((ScopeType_t)(x)) 318 #define INT2AUTHENUM(x) ((AuthType_t)(x)) 319 #define INT2SECENUM(x) ((TlsType_t)(x)) 320 #define INT2PREFONLYENUM(x) ((PrefOnly_t)(x)) 321 #define INT2CREDLEVELENUM(x) ((CredLevel_t)(x)) 322 #define INT2SHADOWUPDATENUM(x) ((enableShadowUpdate_t)(x)) 323 324 #define INT2LDAPRETURN(x) ((ns_ldap_return_code)(x)) 325 #define INT2CONFIGRETURN(x) ((ns_ldap_config_return_code)(x)) 326 #define INT2PARTIALRETURN(x) ((ns_ldap_partial_return_code)(x)) 327 328 /* 329 * This structure maps service name to rdn components 330 * for use in __ns_getDNs. It also defines the SSD-to-use 331 * service for use in __s_api_get_SSDtoUse_service. 332 * The idea of an SSD-to-use service is to reduce the configuration 333 * complexity. For a service, which does not have its own entries in 334 * the LDAP directory, SSD for it is useless, and should not be set. 335 * But since this service must share the container with at least 336 * one other service which does have it own entries, the SSD for 337 * this other service will be shared by this service. 338 * This other service is called the SSD-to-use service. 339 * 340 */ 341 342 typedef struct ns_service_map { 343 char *service; 344 char *rdn; 345 char *SSDtoUse_service; 346 } ns_service_map; 347 348 /* 349 * This structure contains a single mapping from: 350 * service:orig -> list of mapped 351 */ 352 353 typedef enum { 354 NS_ATTR_MAP, 355 NS_OBJ_MAP 356 } ns_maptype_t; 357 358 typedef struct ns_mapping { 359 ns_maptype_t type; 360 char *service; 361 char *orig; 362 char **map; 363 } ns_mapping_t; 364 365 /* 366 * The following is the list of internal libsldap configuration data 367 * structures. The configuration is populated normally once per 368 * application. The assumption is that in applications can be 369 * relatively short lived (IE ls via nsswitch) so it is important to 370 * keep configuration to a minimum, but keep lookups fast. 371 * 372 * Assumptions: 373 * 1 configuration entry per domain, and almost always 1 domain 374 * per app. Hooks exist for multiple domains per app. 375 * 376 * Configurations are read in from client file cache or from LDAP. 377 * Attribute/objectclass mappings are hashed to improve lookup 378 * speed. 379 */ 380 381 /* 382 * Hash entry types 383 */ 384 typedef enum _ns_hashtype_t { 385 NS_HASH_AMAP = 1, /* attr map */ 386 NS_HASH_RAMAP = 2, /* reverse attr map */ 387 NS_HASH_OMAP = 3, /* oc map */ 388 NS_HASH_ROMAP = 4, /* reverse oc map */ 389 NS_HASH_VOID = 5 390 } ns_hashtype_t; 391 392 typedef struct ns_hash { 393 ns_hashtype_t h_type; 394 ns_mapping_t *h_map; 395 struct ns_hash *h_next; 396 struct ns_hash *h_llnext; 397 } ns_hash_t; 398 399 /* 400 * This structure defines the format of an internal configuration 401 * parameter for ns_ldap client. 402 */ 403 404 typedef struct ns_param { 405 ns_datatype_t ns_ptype; 406 int ns_acnt; 407 union { 408 char **ppc; 409 int *pi; 410 char *pc; 411 int i; 412 time_t tm; 413 } ns_pu; 414 } ns_param_t; 415 416 #define ns_ppc ns_pu.ppc 417 #define ns_pi ns_pu.pi 418 #define ns_pc ns_pu.pc 419 #define ns_i ns_pu.i 420 #define ns_tm ns_pu.tm 421 422 /* 423 * This structure defines an instance of a configuration structure. 424 * paramList contains the current ns_ldap parameter configuration 425 * and hashTbl contain the current attribute/objectclass mappings. 426 * Parameters are indexed by using the value assigned to the parameter 427 * in ParamIndexType. 428 */ 429 430 typedef struct ns_config { 431 char *domainName; 432 ns_version_t version; 433 ns_param_t paramList[NS_LDAP_MAX_PIT_P]; 434 ns_hash_t *hashTbl[NS_HASH_MAX]; 435 ns_hash_t *llHead; 436 ns_ldap_entry_t *RootDSE; 437 boolean_t delete; 438 mutex_t config_mutex; 439 int nUse; 440 ldap_get_chg_cookie_t config_cookie; 441 } ns_config_t; 442 443 /* 444 * This structure defines the mapping of the NSCONFIGFILE file 445 * statements into their corresponding SolarisNamingProfile, 446 * Posix Mapping LDAP attributes, and to their corresponding 447 * ParamIndexType enum mapping. THe ParamIndexType enum 448 * definitions can be found in ns_ldap.h. This structure also 449 * defines the default values that are used when a value either 450 * does not exist or is undefined. 451 */ 452 453 typedef struct ns_default_config { 454 const char *name; /* config file parameter name */ 455 ParamIndexType index; /* config file enum index */ 456 ns_conftype_t config_type; /* CLIENT/SERVER/CREDCONFIG */ 457 ns_datatype_t data_type; /* ppc,pi,pc,int etc... */ 458 int single_valued; /* TRUE OR FALSE */ 459 ns_version_t version; /* Version # for attribute */ 460 const char *profile_name; /* profile schema attribute name */ 461 ns_param_t defval; /* config file parameter default */ 462 int (*ns_verify)(ParamIndexType i, 463 struct ns_default_config *def, 464 ns_param_t *param, 465 char *errbuf); 466 ns_enum_map *allowed; /* allowed values */ 467 } ns_default_config; 468 469 470 /* 471 * This typedef enumerates all the supported authentication 472 * mechanisms currently supported in this library 473 */ 474 475 typedef enum EnumAuthType { 476 NS_LDAP_EA_NONE = 0, 477 NS_LDAP_EA_SIMPLE = 1, 478 NS_LDAP_EA_SASL_NONE = 2, 479 NS_LDAP_EA_SASL_CRAM_MD5 = 3, 480 NS_LDAP_EA_SASL_DIGEST_MD5 = 4, 481 NS_LDAP_EA_SASL_DIGEST_MD5_INT = 5, 482 NS_LDAP_EA_SASL_DIGEST_MD5_CONF = 6, 483 NS_LDAP_EA_SASL_EXTERNAL = 7, 484 NS_LDAP_EA_SASL_GSSAPI = 8, 485 NS_LDAP_EA_SASL_SPNEGO = 9, /* unsupported */ 486 NS_LDAP_EA_TLS_NONE = 10, 487 NS_LDAP_EA_TLS_SIMPLE = 11, 488 NS_LDAP_EA_TLS_SASL_NONE = 12, 489 NS_LDAP_EA_TLS_SASL_CRAM_MD5 = 13, 490 NS_LDAP_EA_TLS_SASL_DIGEST_MD5 = 14, 491 NS_LDAP_EA_TLS_SASL_DIGEST_MD5_INT = 15, 492 NS_LDAP_EA_TLS_SASL_DIGEST_MD5_CONF = 16, 493 NS_LDAP_EA_TLS_SASL_EXTERNAL = 17, 494 NS_LDAP_EA_TLS_SASL_GSSAPI = 18, /* unsupported */ 495 NS_LDAP_EA_TLS_SASL_SPNEGO = 19 /* unsupported */ 496 } EnumAuthType_t; 497 498 499 /* 500 * this enum lists the various states of the search state machine 501 */ 502 503 typedef enum { 504 INIT = 1, 505 EXIT = 2, 506 NEXT_SEARCH_DESCRIPTOR = 3, 507 GET_SESSION = 4, 508 NEXT_SESSION = 5, 509 RESTART_SESSION = 6, 510 NEXT_SEARCH = 7, 511 NEXT_VLV = 8, 512 NEXT_PAGE = 9, 513 ONE_SEARCH = 10, 514 DO_SEARCH = 11, 515 NEXT_RESULT = 12, 516 MULTI_RESULT = 13, 517 PROCESS_RESULT = 14, 518 END_PROCESS_RESULT = 15, 519 END_RESULT = 16, 520 NEXT_REFERRAL = 17, 521 GET_REFERRAL_SESSION = 18, 522 ERROR = 19, 523 LDAP_ERROR = 20, 524 GET_ACCT_MGMT_INFO = 21, 525 CLEAR_RESULTS = 22, 526 REINIT = 23 527 } ns_state_t; 528 529 /* 530 * this enum lists the various states of the write state machine 531 */ 532 typedef enum { 533 W_INIT = 1, 534 W_EXIT = 2, 535 GET_CONNECTION = 3, 536 SELECT_OPERATION_SYNC = 4, 537 SELECT_OPERATION_ASYNC = 5, 538 DO_ADD_SYNC = 6, 539 DO_DELETE_SYNC = 7, 540 DO_MODIFY_SYNC = 8, 541 DO_ADD_ASYNC = 9, 542 DO_DELETE_ASYNC = 10, 543 DO_MODIFY_ASYNC = 11, 544 GET_RESULT_SYNC = 12, 545 GET_RESULT_ASYNC = 13, 546 PARSE_RESULT = 14, 547 GET_REFERRAL_CONNECTION = 15, 548 W_LDAP_ERROR = 16, 549 W_ERROR = 17 550 } ns_write_state_t; 551 552 553 typedef int ConnectionID; 554 555 /* 556 * This structure is used by ns_connect to create and manage 557 * one or more ldap connections within the library. 558 */ 559 typedef struct connection { 560 ConnectionID connectionId; 561 boolean_t usedBit; /* true if only used by */ 562 /* one thread and not shared */ 563 /* by other threads */ 564 pid_t pid; /* process id */ 565 char *serverAddr; 566 ns_cred_t *auth; 567 LDAP *ld; 568 thread_t threadID; /* thread ID using it */ 569 struct ns_ldap_cookie *cookieInfo; 570 char **controls; /* from server_info */ 571 char **saslMechanisms; /* from server_info */ 572 } Connection; 573 574 #define ONE_STEP 1 575 576 /* 577 * This structure is for referrals processing. 578 * The data are from referral URLs returned by 579 * LDAP servers 580 */ 581 typedef struct ns_referral_info { 582 struct ns_referral_info *next; 583 char *refHost; 584 int refScope; 585 char *refDN; 586 char *refFilter; 587 } ns_referral_info_t; 588 589 struct ns_ldap_cookie; 590 591 /* 592 * Batch used by __ns_ldap_list_batch_xxx API 593 */ 594 struct ns_ldap_list_batch { 595 uint32_t nactive; 596 struct ns_ldap_cookie *next_cookie; 597 struct ns_ldap_cookie *cookie_list; 598 }; 599 600 struct ns_conn_user; 601 typedef struct ns_conn_user ns_conn_user_t; 602 603 /* 604 * This structure used internally in searches 605 */ 606 607 typedef struct ns_ldap_cookie { 608 /* INPUTS */ 609 /* server list position */ 610 611 /* service search descriptor list & position */ 612 ns_ldap_search_desc_t **sdlist; 613 ns_ldap_search_desc_t **sdpos; 614 615 /* search filter callback */ 616 int use_filtercb; 617 int (*init_filter_cb)(const ns_ldap_search_desc_t *desc, 618 char **realfilter, const void *userdata); 619 620 /* user callback */ 621 int use_usercb; 622 int (*callback)(const ns_ldap_entry_t *entry, 623 const void *userdata); 624 const void *userdata; 625 626 int followRef; 627 int use_paging; 628 char *service; 629 char *i_filter; 630 const char * const *i_attr; 631 const ns_cred_t *i_auth; 632 int i_flags; 633 634 /* OUTPUTS */ 635 ns_ldap_result_t *result; 636 ns_ldap_entry_t *nextEntry; 637 /* Error data */ 638 int err_rc; 639 ns_ldap_error_t *errorp; 640 641 /* PRIVATE */ 642 ns_state_t state; 643 ns_state_t new_state; 644 ns_state_t next_state; 645 646 Connection *conn; 647 #define conn_auth_type conn->auth->auth.type 648 ConnectionID connectionId; 649 650 /* paging VLV/SIMPLEPAGE data */ 651 int listType; 652 unsigned long index; 653 LDAPControl **p_serverctrls; 654 655 int scope; 656 char *basedn; 657 char *filter; 658 char **attribute; 659 660 /* RESULT PROCESSING */ 661 int msgId; 662 LDAPMessage *resultMsg; 663 664 char **dns; 665 char *currentdn; 666 int flag; 667 struct berval *ctrlCookie; 668 669 /* REFERRALS PROCESSING */ 670 /* referralinfo list & position */ 671 ns_referral_info_t *reflist; 672 ns_referral_info_t *refpos; 673 /* search timeout value */ 674 struct timeval search_timeout; 675 /* response control to hold account management information */ 676 LDAPControl **resultctrl; 677 /* Flag to indicate password less account management is required */ 678 int nopasswd_acct_mgmt; 679 int err_from_result; 680 ns_conn_user_t *conn_user; 681 682 /* BATCH PROCESSING */ 683 ns_ldap_list_batch_t *batch; 684 boolean_t no_wait; 685 boolean_t reinit_on_retriable_err; 686 int retries; 687 ns_ldap_result_t **caller_result; 688 ns_ldap_error_t **caller_errorp; 689 int *caller_rc; 690 struct ns_ldap_cookie *next_cookie_in_batch; 691 } ns_ldap_cookie_t; 692 693 /* 694 * This structure is part of the return value information for 695 * __s_api_requestServer. The routine that requests a new server 696 * from the cache manager 697 */ 698 typedef struct ns_server_info { 699 char *server; 700 char *serverFQDN; 701 char **controls; 702 char **saslMechanisms; 703 } ns_server_info_t; 704 705 /* 706 * sasl callback function parameters 707 */ 708 typedef struct ns_sasl_cb_param { 709 char *mech; 710 char *authid; 711 char *authzid; 712 char *passwd; 713 char *realm; 714 } ns_sasl_cb_param_t; 715 716 /* self/sasl/gssapi variable */ 717 extern int sasl_gssapi_inited; 718 719 /* Multiple threads per connection variable */ 720 extern int MTperConn; 721 722 /* 723 * INTERNAL GLOBAL DEFINITIONS AND FUNCTION DECLARATIONS 724 */ 725 726 #ifdef DEBUG 727 extern int __ldap_debug_file; 728 extern int __ldap_debug_api; 729 extern int __ldap_debug_ldap; 730 extern int __ldap_debug_servers; 731 #endif 732 733 /* internal connection APIs */ 734 void DropConnection(ConnectionID, int); 735 int __s_api_getServers(char *** servers, ns_ldap_error_t ** error); 736 737 int __s_get_enum_value(ns_config_t *ptr, char *value, ParamIndexType i); 738 char *__s_get_auth_name(ns_config_t *ptr, AuthType_t type); 739 char *__s_get_security_name(ns_config_t *ptr, TlsType_t type); 740 char *__s_get_scope_name(ns_config_t *ptr, ScopeType_t type); 741 char *__s_get_pref_name(PrefOnly_t type); 742 char *__s_get_searchref_name(ns_config_t *ptr, SearchRef_t type); 743 char *__s_get_shadowupdate_name(enableShadowUpdate_t type); 744 char *__s_get_hostcertpath(void); 745 void __s_api_free_sessionPool(); 746 int __s_api_requestServer(const char *request, const char *server, 747 ns_server_info_t *ret, ns_ldap_error_t **error, const char *addrType); 748 749 750 /* ************ internal sldap-api functions *********** */ 751 void __ns_ldap_freeEntry(ns_ldap_entry_t *ep); 752 void __s_api_split_key_value(char *buffer, char **name, char **value); 753 int __s_api_printResult(ns_ldap_result_t *); 754 int __s_api_getSearchScope(int *, ns_ldap_error_t **); 755 int __s_api_getDNs(char ***, const char *, 756 ns_ldap_error_t **); 757 int __s_api_get_search_DNs_v1(char ***, const char *, 758 ns_ldap_error_t **); 759 int __s_api_getConnection(const char *, const int, 760 const ns_cred_t *, int *, 761 Connection **, ns_ldap_error_t **, int, int, ns_conn_user_t *); 762 char **__s_api_cp2dArray(char **); 763 void __s_api_free2dArray(char **); 764 765 int __s_api_isCtrlSupported(Connection *, char *); 766 ns_config_t *__ns_ldap_make_config(ns_ldap_result_t *result); 767 ns_auth_t *__s_api_AuthEnumtoStruct(const EnumAuthType_t i); 768 boolean_t __s_api_peruser_proc(void); 769 boolean_t __s_api_nscd_proc(void); 770 char *dvalue(char *); 771 char *evalue(char *); 772 ns_ldap_error_t *__s_api_make_error(int, char *); 773 ns_ldap_error_t *__s_api_copy_error(ns_ldap_error_t *); 774 775 /* ************ specific 'Standalone' functions ********** */ 776 ns_ldap_return_code __s_api_ip2hostname(char *ipaddr, char **hostname); 777 struct hostent *__s_api_hostname2ip(const char *name, 778 struct hostent *result, 779 char *buffer, 780 int buflen, 781 int *h_errnop); 782 void __s_api_setInitMode(); 783 void __s_api_unsetInitMode(); 784 int __s_api_isStandalone(void); 785 int __s_api_isInitializing(); 786 ns_ldap_return_code __s_api_findRootDSE(const char *request, 787 const char *server, 788 const char *addrType, 789 ns_server_info_t *ret, 790 ns_ldap_error_t **error); 791 ns_config_t *__s_api_create_config_door_str(char *config, 792 ns_ldap_error_t **errorp); 793 794 extern void get_environment(); 795 796 /* internal Param APIs */ 797 int __ns_ldap_setParamValue(ns_config_t *ptr, 798 const ParamIndexType type, 799 const void *data, ns_ldap_error_t **error); 800 int __s_api_get_type(const char *value, ParamIndexType *type); 801 int __s_api_get_versiontype(ns_config_t *ptr, char *value, 802 ParamIndexType *type); 803 int __s_api_get_profiletype(char *value, ParamIndexType *type); 804 void __s_api_init_config(ns_config_t *ptr); 805 void __s_api_init_config_global(ns_config_t *ptr); 806 ns_parse_status __s_api_crosscheck(ns_config_t *domainptr, char *errstr, 807 int check_dn); 808 ns_config_t *__s_api_create_config(void); 809 ns_config_t *__s_api_get_default_config(void); 810 ns_config_t *__s_api_get_default_config_global(void); 811 ns_config_t *__s_api_loadrefresh_config(); 812 ns_config_t *__s_api_loadrefresh_config_global(); 813 void __s_api_destroy_config(ns_config_t *ptr); 814 int __s_api_get_configtype(ParamIndexType type); 815 const char *__s_api_get_configname(ParamIndexType type); 816 char *__s_api_strValue(ns_config_t *ptr, char *str, 817 int bufsz, ParamIndexType i, 818 ns_strfmt_t fmt); 819 void __s_api_release_config(ns_config_t *cfg); 820 821 /* internal attribute/objectclass mapping api's */ 822 int __s_api_add_map2hash(ns_config_t *config, 823 ns_hashtype_t type, ns_mapping_t *map); 824 void __s_api_destroy_hash(ns_config_t *config); 825 int __s_api_parse_map(char *cp, char **sid, 826 char **origA, char ***mapA); 827 char **__ns_ldap_mapAttributeList(const char *service, 828 const char * const *origAttrList); 829 830 /* internal configuration APIs */ 831 void __ns_ldap_setServer(int set); 832 ns_ldap_error_t *__ns_ldap_LoadConfiguration(); 833 ns_ldap_error_t *__ns_ldap_LoadDoorInfo(LineBuf *configinfo, char *domainname, 834 ns_config_t *new, int cred_only); 835 ns_ldap_error_t *__ns_ldap_DumpConfiguration(char *filename); 836 ns_ldap_error_t *__ns_ldap_DumpLdif(char *filename); 837 int __ns_ldap_cache_ping(); 838 ns_ldap_error_t *__ns_ldap_print_config(int); 839 void __ns_ldap_default_config(); 840 int __ns_ldap_download(const char *, char *, char *, 841 ns_ldap_error_t **); 842 int 843 __ns_ldap_check_dns_preq(int foreground, 844 int mode_verbose, 845 int mode_quiet, 846 const char *fname, 847 ns_ldap_self_gssapi_config_t config, 848 ns_ldap_error_t **errpp); 849 int 850 __ns_ldap_check_gssapi_preq(int foreground, 851 int mode_verbose, 852 int mode_quiet, 853 ns_ldap_self_gssapi_config_t config, 854 ns_ldap_error_t **errpp); 855 int 856 __ns_ldap_check_all_preq(int foreground, 857 int mode_verbose, 858 int mode_quiet, 859 ns_ldap_self_gssapi_config_t config, 860 ns_ldap_error_t **errpp); 861 862 /* internal un-exposed APIs */ 863 ns_cred_t *__ns_ldap_dupAuth(const ns_cred_t *authp); 864 boolean_t __s_api_is_auth_matched(const ns_cred_t *auth1, 865 const ns_cred_t *auth2); 866 int __s_api_get_SSD_from_SSDtoUse_service(const char *service, 867 ns_ldap_search_desc_t ***SSDlist, 868 ns_ldap_error_t **errorp); 869 int __s_api_prepend_automountmapname(const char *service, 870 ns_ldap_search_desc_t ***SSDlist, 871 ns_ldap_error_t ** errorp); 872 int __s_api_prepend_automountmapname_to_dn(const char *service, 873 char **basedn, 874 ns_ldap_error_t ** errorp); 875 int __s_api_convert_automountmapname(const char *service, 876 char **dn, ns_ldap_error_t ** errorp); 877 int __s_api_replace_mapped_attr_in_dn( 878 const char *orig_attr, const char *mapped_attr, 879 const char *dn, char **new_dn); 880 int __s_api_append_default_basedn( 881 const char *dn, 882 char **new_dn, 883 int *allocated, 884 ns_ldap_error_t ** errorp); 885 int __s_api_removeServer(const char *server); 886 void __s_api_removeBadServers(char **server); 887 void __s_api_free_server_info(ns_server_info_t *sinfo); 888 void __s_api_freeConnection(Connection *con); 889 890 /* internal referrals APIs */ 891 int __s_api_toFollowReferrals(const int flags, 892 int *toFollow, 893 ns_ldap_error_t **errorp); 894 int __s_api_addRefInfo(ns_referral_info_t **head, 895 char *url, char *baseDN, int *scope, 896 char *filter, LDAP *ld); 897 void __s_api_deleteRefInfo(ns_referral_info_t *head); 898 899 /* callback routine for SSD filters */ 900 int __s_api_merge_SSD_filter(const ns_ldap_search_desc_t *desc, 901 char **realfilter, 902 const void *userdata); 903 904 /* network address verification api */ 905 int __s_api_isipv4(char *addr); 906 int __s_api_isipv6(char *addr); 907 int __s_api_ishost(char *addr); 908 909 /* password management routine */ 910 ns_ldap_passwd_status_t 911 __s_api_set_passwd_status(int errnum, char *errmsg); 912 int __s_api_contain_passwd_control_oid(char **oids); 913 914 /* password less account management routine */ 915 int __s_api_contain_account_usable_control_oid(char **oids); 916 917 /* RFC 2307 section 5.6. Get a canonical name from entry */ 918 char *__s_api_get_canonical_name(ns_ldap_entry_t *entry, 919 ns_ldap_attr_t *attrptr, int case_ignore); 920 921 /* self/sasl/gssapi functions */ 922 int __s_api_sasl_bind_callback( 923 LDAP *ld, 924 unsigned flags, 925 void *defaults, 926 void *in); 927 928 int __s_api_self_gssapi_only_get(void); 929 int __s_api_sasl_gssapi_init(void); 930 931 #ifdef __cplusplus 932 } 933 #endif 934 935 #endif /* _NS_INTERNAL_H */ 936