xref: /onnv-gate/usr/src/cmd/ldap/ns_ldap/mapping.c (revision 12788:c71b0e8f856c)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51450Sjanga  * Common Development and Distribution License (the "License").
61450Sjanga  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
211676Sjpk 
220Sstevel@tonic-gate /*
23*12788Sgary.winiger@oracle.com  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #include <ctype.h>
270Sstevel@tonic-gate #include <libintl.h>
280Sstevel@tonic-gate #include <strings.h>
290Sstevel@tonic-gate #include <stdio.h>
301676Sjpk #include <tsol/label.h>
310Sstevel@tonic-gate #include "../../../lib/libsldap/common/ns_sldap.h"
320Sstevel@tonic-gate 
330Sstevel@tonic-gate 
340Sstevel@tonic-gate #define	SAME	0
350Sstevel@tonic-gate 
360Sstevel@tonic-gate struct mapping {
370Sstevel@tonic-gate 	char *database;
380Sstevel@tonic-gate 	char *def_type;
390Sstevel@tonic-gate 	char *objectclass;
400Sstevel@tonic-gate 	char *actual_db;
410Sstevel@tonic-gate };
420Sstevel@tonic-gate 
430Sstevel@tonic-gate #define	PUBLICKEY	0
440Sstevel@tonic-gate 
450Sstevel@tonic-gate static struct mapping maplist[] = {
460Sstevel@tonic-gate 	{"publickey", "uidnumber", "niskeyobject", "passwd"},
470Sstevel@tonic-gate 	{"publickey", "cn", "niskeyobject", "host"},
480Sstevel@tonic-gate 	{"bootparams", "cn", "bootableDevice", NULL},
490Sstevel@tonic-gate 	{"ethers", "cn", "ieee802Device", NULL},
500Sstevel@tonic-gate 	{"group", "cn", "posixgroup", NULL},
510Sstevel@tonic-gate 	{"hosts", "cn", "iphost", NULL},
520Sstevel@tonic-gate 	{"ipnodes", "cn", "iphost", NULL},
530Sstevel@tonic-gate 	{"netgroup", "cn", "nisnetgroup", NULL},
540Sstevel@tonic-gate 	{"netmasks", "ipnetworknumber", "ipnetwork", NULL},
550Sstevel@tonic-gate 	{"networks", "ipnetworknumber", "ipnetwork", NULL},
560Sstevel@tonic-gate 	{"passwd", "uid", "posixaccount", NULL},
570Sstevel@tonic-gate 	{"protocols", "cn", "ipprotocol", NULL},
580Sstevel@tonic-gate 	{"rpc", "cn", "oncrpc", NULL},
590Sstevel@tonic-gate 	{"services", "cn", "ipservice", NULL},
600Sstevel@tonic-gate 	{"aliases", "cn", "mailGroup", NULL},
610Sstevel@tonic-gate 	{"project", "SolarisProjectID", "SolarisProject", NULL},
620Sstevel@tonic-gate 	{"printers", "printer-uri", "sunPrinter", NULL},
630Sstevel@tonic-gate 	{"shadow", "uid", "shadowaccount", NULL},
640Sstevel@tonic-gate 	{"auth_attr", "cn", "SolarisAuthAttr", NULL},
650Sstevel@tonic-gate 	{"prof_attr", "cn", "SolarisProfAttr", NULL},
660Sstevel@tonic-gate 	{"exec_attr", "cn", "SolarisExecAttr", NULL},
670Sstevel@tonic-gate 	{"user_attr", "uid", "SolarisUserAttr", NULL},
681676Sjpk 	{"tnrhtp", "ipTnetTemplateName", "ipTnetTemplate", NULL},
691676Sjpk 	{"tnrhdb", "ipTnetNumber", "ipTnetHost", NULL},
700Sstevel@tonic-gate 	{NULL, NULL, NULL, NULL}
710Sstevel@tonic-gate };
720Sstevel@tonic-gate 
732830Sdjl #define	PROF_ATTR_FILTER \
742830Sdjl 	"(&(objectclass=SolarisProfAttr)(!(SolarisKernelSecurityPolicy=*))%s)"
752830Sdjl #define	TNRHTP_FILTER \
762830Sdjl 	"(&(objectclass=ipTnetTemplate)(!(objectclass=ipTnetHost))%s)"
772830Sdjl #define	OC_FILTER	"objectclass=%s"
782830Sdjl #define	OC_FLEN		15
792830Sdjl #define	OC_FILTER2	"(&(objectclass=%s)%s)"
802830Sdjl #define	OC_FLEN2	22
812830Sdjl 
821450Sjanga /* Malloc and print error message in case of failure */
831450Sjanga #define	MALLOC(ptr, len) \
841450Sjanga 	if ((ptr = (char *)malloc(len)) == NULL) { \
851450Sjanga 		(void) fprintf(stderr, gettext("out of memory\n")); \
861450Sjanga 	}
871450Sjanga 
881450Sjanga /*
891450Sjanga  * Allocate memory for filter and user data. Set
901450Sjanga  * error to 1 if either of the mallocs fail.
911450Sjanga  * In addition, free the memory allocated for filter,
921450Sjanga  * if memory allocation for user data fails.
931450Sjanga  */
941450Sjanga #define	MALLOC_FILTER_UDATA(ptr1, len1, ptr2, len2, error) \
951450Sjanga 	error = 0; \
961450Sjanga 	MALLOC(ptr1, len1); \
971450Sjanga 	if (!ptr1) { \
981450Sjanga 		error = 1; \
991450Sjanga 	} \
1001450Sjanga 	else { \
1011450Sjanga 		MALLOC(ptr2, len2); \
1021450Sjanga 		if (!ptr2) { \
1031450Sjanga 			error = 1; \
1041450Sjanga 			free(ptr1); \
1051450Sjanga 		} \
1061450Sjanga 	}
1070Sstevel@tonic-gate 
1080Sstevel@tonic-gate void
printMapping()1090Sstevel@tonic-gate printMapping()
1100Sstevel@tonic-gate {
1110Sstevel@tonic-gate 	int	i;
1120Sstevel@tonic-gate 
1131450Sjanga 	(void) fprintf(stdout,
114*12788Sgary.winiger@oracle.com 	    gettext("database       default type        objectclass\n"));
1151450Sjanga 	(void) fprintf(stdout,
116*12788Sgary.winiger@oracle.com 	    gettext("=============  =================   =============\n"));
1170Sstevel@tonic-gate 	/* first dump auto_* and automount which are not in maplist[] */
1181450Sjanga 	(void) fprintf(stdout, "%-15s%-20s%s\n", "auto_*", "automountKey",
119*12788Sgary.winiger@oracle.com 	    "automount");
1201450Sjanga 	(void) fprintf(stdout, "%-15s%-20s%s\n", "automount",
121*12788Sgary.winiger@oracle.com 	    "automountMapName", "automountMap");
1220Sstevel@tonic-gate 	for (i = 0; maplist[i].database != NULL; i++) {
1231676Sjpk 		/* skip printing shadow */
1241676Sjpk 		if (strcasecmp(maplist[i].database, "shadow") == 0)
1251676Sjpk 			continue;
1261676Sjpk 		if (!is_system_labeled()) {
1271676Sjpk 			/*
1281676Sjpk 			 * do not print tnrhdb and tnrhtp if system is
1291676Sjpk 			 * not configured with Trusted Extensions
1301676Sjpk 			 */
1311676Sjpk 			if ((strcasecmp(maplist[i].database, "tnrhdb") == 0) ||
1321676Sjpk 			    (strcasecmp(maplist[i].database, "tnrhtp") == 0))
1331676Sjpk 				continue;
1341676Sjpk 		}
1351450Sjanga 		(void) fprintf(stdout, "%-15s%-20s%s\n", maplist[i].database,
1361676Sjpk 		    maplist[i].def_type, maplist[i].objectclass);
1370Sstevel@tonic-gate 	}
1380Sstevel@tonic-gate }
1390Sstevel@tonic-gate 
1401450Sjanga /*
1411450Sjanga  * set_key routine to handle user specified keys.
1421450Sjanga  * A key can be of the form: attribute=value or value.
1431450Sjanga  * A filter is constructed from a set of keys specified in
1441450Sjanga  * the form (|(key1)(key2)...(keyn))
1451450Sjanga  * It returns: NULL if no keys are defined or
1461450Sjanga  *		the keyfilter as constructed above.
1471450Sjanga  */
1480Sstevel@tonic-gate 
1490Sstevel@tonic-gate char *
set_keys(char ** key,char * attrtype)1500Sstevel@tonic-gate set_keys(char **key, char *attrtype)
1510Sstevel@tonic-gate {
1520Sstevel@tonic-gate 	char	*keyeq = NULL;
1531450Sjanga 	char	*keyfilter = NULL;
1541450Sjanga 	int	len, totlen = 1; /* Terminating NULL byte */
1550Sstevel@tonic-gate 	char	*k, **karray;
1561450Sjanga 	char	*tmpptr;
1570Sstevel@tonic-gate 
1580Sstevel@tonic-gate 	if (!key || !key[0])	/* should never contain NULL string */
1590Sstevel@tonic-gate 		return (NULL);
1600Sstevel@tonic-gate 
1611450Sjanga 	if (key[1]) {
1621450Sjanga 		totlen += 3;
1631450Sjanga 		/* Allocate memory for '(|)' */
1641450Sjanga 		MALLOC(keyfilter, totlen);
1651450Sjanga 		if (!keyfilter)
1661450Sjanga 			exit(2);
1671450Sjanga 		(void) snprintf(keyfilter, totlen, "(|");
1680Sstevel@tonic-gate 	}
1690Sstevel@tonic-gate 
1700Sstevel@tonic-gate 	karray = key;
1711450Sjanga 	while ((k = *karray) != 0) {
1720Sstevel@tonic-gate 		keyeq = strchr(k, '=');
1731450Sjanga 		if (keyeq) {
1741450Sjanga 			/* make enough room for (%s) */
1751450Sjanga 			totlen += strlen(k) + 2;
1761450Sjanga 		} else {
1771450Sjanga 			/* make enough room for (%s=%s) */
1781450Sjanga 			totlen += strlen(attrtype) + strlen(k) + 3;
1791450Sjanga 		}
1801450Sjanga 
1811450Sjanga 		len = keyfilter ? strlen(keyfilter) : 0;
1821450Sjanga 
1831450Sjanga 		if (!(tmpptr = (char *)realloc(keyfilter, totlen))) {
1841450Sjanga 			if (keyfilter)
1851450Sjanga 				free(keyfilter);
1861450Sjanga 			(void) fprintf(stderr, gettext("out of memory\n"));
1870Sstevel@tonic-gate 			exit(2);
1880Sstevel@tonic-gate 		}
1891450Sjanga 		keyfilter = tmpptr;
1901450Sjanga 
1911450Sjanga 		if (keyeq) {
1921450Sjanga 			(void) snprintf(keyfilter + len, totlen - len,
193*12788Sgary.winiger@oracle.com 			    "(%s)", k);
1941450Sjanga 		} else {
1951450Sjanga 			(void) snprintf(keyfilter + len, totlen - len,
196*12788Sgary.winiger@oracle.com 			    "(%s=%s)", attrtype, k);
1971450Sjanga 		}
1980Sstevel@tonic-gate 		karray++;
1990Sstevel@tonic-gate 	}
2001450Sjanga 
2011450Sjanga 	if (key[1]) {
2021450Sjanga 		/* We allocated memory for this earlier */
2031450Sjanga 		(void) strlcat(keyfilter, ")", totlen);
2041450Sjanga 	}
2051450Sjanga 
2060Sstevel@tonic-gate 	return (keyfilter);
2070Sstevel@tonic-gate }
2080Sstevel@tonic-gate 
2090Sstevel@tonic-gate 
2100Sstevel@tonic-gate /*
2110Sstevel@tonic-gate  * A special set_key routine for to handle public keys.
2120Sstevel@tonic-gate  * If the key starts with a digiti, view it as a user id.
2130Sstevel@tonic-gate  * Otherwise, view it as a hostname.
2140Sstevel@tonic-gate  * It returns: -1 no keys defined, 0 key defined but none for type
2150Sstevel@tonic-gate  *		specified, n>0 number of matches found.
2160Sstevel@tonic-gate  */
2170Sstevel@tonic-gate int
set_keys_publickey(char ** key,char * attrtype,int type,char ** ret)2180Sstevel@tonic-gate set_keys_publickey(char **key, char *attrtype, int type, char **ret)
2190Sstevel@tonic-gate {
2200Sstevel@tonic-gate 	char	*keyeq = NULL;
2211450Sjanga 	char	*keyfilter = NULL;
2221450Sjanga 	char	*pre_filter = NULL;
2230Sstevel@tonic-gate 	char	*k, **karray;
2240Sstevel@tonic-gate 	int	count = 0;
2251450Sjanga 	int	len, totlen = 1; /* Terminating NULL byte */
2261450Sjanga 	char	*tmpptr;
2270Sstevel@tonic-gate 
2280Sstevel@tonic-gate 	if (!key || !key[0]) {	/* should never contain NULL string */
2290Sstevel@tonic-gate 		*ret = NULL;
2300Sstevel@tonic-gate 		return (-1);
2310Sstevel@tonic-gate 	}
2320Sstevel@tonic-gate 
2330Sstevel@tonic-gate 	karray = key;
2341450Sjanga 	while ((k = *karray) != 0) {
2350Sstevel@tonic-gate 		keyeq = strchr(k, '=');
2361450Sjanga 		if (keyeq) {
2371450Sjanga 			/* make enough room for (%s) */
2381450Sjanga 			totlen += strlen(k) + 2;
2391450Sjanga 		} else {
2401450Sjanga 			if ((type == 0 && isdigit(*k)) ||
2410Sstevel@tonic-gate 				/* user type keys */
2421450Sjanga 			    (type == 1 && (!isdigit(*k)))) {
2430Sstevel@tonic-gate 				/* hosts type keys */
2441450Sjanga 				/* make enough room for (%s=%s) */
2451450Sjanga 				totlen += strlen(k) + strlen(attrtype) + 3;
2460Sstevel@tonic-gate 			} else {
2470Sstevel@tonic-gate 				karray++;
2480Sstevel@tonic-gate 				continue;
2490Sstevel@tonic-gate 			}
2500Sstevel@tonic-gate 		}
2511450Sjanga 
2521450Sjanga 		len = pre_filter ? strlen(pre_filter) : 0;
2531450Sjanga 
2541450Sjanga 		if (!(tmpptr = (char *)realloc(pre_filter, totlen))) {
2551450Sjanga 			if (pre_filter)
2561450Sjanga 				free(pre_filter);
2571450Sjanga 			(void) fprintf(stderr, gettext("out of memory\n"));
2580Sstevel@tonic-gate 			exit(2);
2590Sstevel@tonic-gate 		}
2601450Sjanga 		pre_filter = tmpptr;
2611450Sjanga 
2621450Sjanga 		if (keyeq) {
2631450Sjanga 			(void) snprintf(pre_filter + len, totlen - len,
264*12788Sgary.winiger@oracle.com 			    "(%s)", k);
2651450Sjanga 		} else {
2661450Sjanga 			(void) snprintf(pre_filter + len, totlen - len,
267*12788Sgary.winiger@oracle.com 			    "(%s=%s)", attrtype, k);
2681450Sjanga 		}
2690Sstevel@tonic-gate 		karray++;
2700Sstevel@tonic-gate 		count++;
2710Sstevel@tonic-gate 	}
2720Sstevel@tonic-gate 	if (count > 1) {
2731450Sjanga 		len = strlen(pre_filter) + 4;
2741450Sjanga 		if (!(keyfilter = (char *)malloc(len))) {
2751450Sjanga 			(void) fprintf(stderr, gettext("out of memory\n"));
2761450Sjanga 			free(pre_filter);
2770Sstevel@tonic-gate 			exit(2);
2780Sstevel@tonic-gate 		}
2791450Sjanga 		(void) snprintf(keyfilter, len, "(|%s)", pre_filter);
2801450Sjanga 		free(pre_filter);
2810Sstevel@tonic-gate 		*ret = keyfilter;
2820Sstevel@tonic-gate 	} else
2830Sstevel@tonic-gate 		*ret = pre_filter;
2840Sstevel@tonic-gate 	return (count);
2850Sstevel@tonic-gate }
2860Sstevel@tonic-gate 
2870Sstevel@tonic-gate /*
2880Sstevel@tonic-gate  * publickey specific set_filter
2890Sstevel@tonic-gate  * type 0 -> check for user publickeys
2900Sstevel@tonic-gate  * type 1 -> check for hosts publickeys
2910Sstevel@tonic-gate  */
2920Sstevel@tonic-gate char *
set_filter_publickey(char ** key,char * database,int type,char ** udata)2930Sstevel@tonic-gate set_filter_publickey(char **key, char *database, int type, char **udata)
2940Sstevel@tonic-gate {
2951450Sjanga 	char 	*filter = NULL;
2960Sstevel@tonic-gate 	char 	*userdata;
2971450Sjanga 	char	*keyfilter = NULL;
2980Sstevel@tonic-gate 	int	rc;
2991450Sjanga 	int	filterlen, udatalen;
3001450Sjanga 	short	nomem = 0;
3010Sstevel@tonic-gate 
3021450Sjanga 	if (!database || !udata) {
3030Sstevel@tonic-gate 		return (NULL);
3040Sstevel@tonic-gate 	}
3050Sstevel@tonic-gate 
3060Sstevel@tonic-gate 	if (strcasecmp(database, maplist[PUBLICKEY].database) == SAME) {
3070Sstevel@tonic-gate 		rc = set_keys_publickey(key,
308*12788Sgary.winiger@oracle.com 		    maplist[PUBLICKEY + type].def_type, type, &keyfilter);
3090Sstevel@tonic-gate 		switch (rc) {
3100Sstevel@tonic-gate 		case -1:
3111450Sjanga 			filterlen = strlen(maplist[PUBLICKEY].objectclass) + 13;
3121450Sjanga 			udatalen = 3;
3131450Sjanga 			MALLOC_FILTER_UDATA(filter, filterlen, userdata,
314*12788Sgary.winiger@oracle.com 			    udatalen, nomem);
3151450Sjanga 			if (!nomem) {
3161450Sjanga 				(void) snprintf(filter, filterlen,
317*12788Sgary.winiger@oracle.com 				    "objectclass=%s",
318*12788Sgary.winiger@oracle.com 				    maplist[PUBLICKEY].objectclass);
3191450Sjanga 				(void) snprintf(userdata, udatalen, "%%s");
3201450Sjanga 			}
3210Sstevel@tonic-gate 			break;
3220Sstevel@tonic-gate 		case 0:
3230Sstevel@tonic-gate 			return (NULL);
3240Sstevel@tonic-gate 		default:
3251450Sjanga 			filterlen = strlen(maplist[PUBLICKEY].objectclass) +
326*12788Sgary.winiger@oracle.com 			    strlen(keyfilter) + 18;
3271450Sjanga 			udatalen = strlen(keyfilter) + 8;
3281450Sjanga 			MALLOC_FILTER_UDATA(filter, filterlen, userdata,
329*12788Sgary.winiger@oracle.com 			    udatalen, nomem);
3301450Sjanga 			if (!nomem) {
331*12788Sgary.winiger@oracle.com 				(void) snprintf(filter, filterlen,
332*12788Sgary.winiger@oracle.com 				    "(&(objectclass=%s)%s)",
333*12788Sgary.winiger@oracle.com 				    maplist[PUBLICKEY].objectclass, keyfilter);
334*12788Sgary.winiger@oracle.com 				(void) snprintf(userdata, udatalen,
335*12788Sgary.winiger@oracle.com 				    "(&(%%s)%s)", keyfilter);
3361450Sjanga 			}
3370Sstevel@tonic-gate 		}
3380Sstevel@tonic-gate 	} else {
3390Sstevel@tonic-gate 		if ((keyfilter = set_keys(key, "cn")) == NULL) {
3401450Sjanga 			filterlen = 14;
3411450Sjanga 			udatalen = 3;
3421450Sjanga 			MALLOC_FILTER_UDATA(filter, filterlen, userdata,
343*12788Sgary.winiger@oracle.com 			    udatalen, nomem);
3441450Sjanga 			if (!nomem) {
3451450Sjanga 				(void) snprintf(filter, filterlen,
346*12788Sgary.winiger@oracle.com 				    "objectclass=*");
3471450Sjanga 				(void) snprintf(userdata, udatalen, "%%s");
3481450Sjanga 			}
3490Sstevel@tonic-gate 		} else {
3501450Sjanga 			filterlen = strlen(keyfilter) + 1;
3511450Sjanga 			udatalen = strlen(keyfilter) + 8;
3521450Sjanga 			MALLOC_FILTER_UDATA(filter, filterlen, userdata,
353*12788Sgary.winiger@oracle.com 			    udatalen, nomem);
3541450Sjanga 			if (!nomem) {
3551450Sjanga 				(void) snprintf(filter, filterlen, "%s",
356*12788Sgary.winiger@oracle.com 				    keyfilter);
3571450Sjanga 				(void) snprintf(userdata, udatalen,
358*12788Sgary.winiger@oracle.com 				    "(&(%%s)%s)", keyfilter);
3591450Sjanga 			}
3600Sstevel@tonic-gate 		}
3610Sstevel@tonic-gate 	}
3620Sstevel@tonic-gate #ifdef DEBUG
3631450Sjanga 	(void) fprintf(stdout, "set_filter: filter=\"%s\"\n", filter);
3641450Sjanga 	(void) fprintf(stdout, "set_filter: userdata=\"%s\"\n", userdata);
3650Sstevel@tonic-gate #endif /* DEBUG */
3661450Sjanga 	if (keyfilter)
3671450Sjanga 		free(keyfilter);
3681450Sjanga 	if (nomem)
3691450Sjanga 		exit(2);
3701450Sjanga 	*udata = userdata;
3710Sstevel@tonic-gate 	return (filter);
3720Sstevel@tonic-gate }
3730Sstevel@tonic-gate 
3740Sstevel@tonic-gate 
3750Sstevel@tonic-gate /* generic set_filter, this function is not thread safe */
3760Sstevel@tonic-gate char *
set_filter(char ** key,char * database,char ** udata)3770Sstevel@tonic-gate set_filter(char **key, char *database, char **udata)
3780Sstevel@tonic-gate {
3791450Sjanga 	char 		*filter = NULL;
3801450Sjanga 	char 		*userdata = NULL;
3810Sstevel@tonic-gate 	char		*keyfilter;
3821450Sjanga 	int		i, filterlen, udatalen;
3830Sstevel@tonic-gate 	int		rc, v2 = 1;
3842830Sdjl 	int		dbpf, dbtp;
3850Sstevel@tonic-gate 	void		**paramVal = NULL;
3860Sstevel@tonic-gate 	ns_ldap_error_t	*errorp = NULL;
3871450Sjanga 	short		nomem;
3880Sstevel@tonic-gate 
3891450Sjanga 	if (!database || !udata) {
3900Sstevel@tonic-gate 		return (NULL);
3910Sstevel@tonic-gate 	}
3920Sstevel@tonic-gate 
3930Sstevel@tonic-gate 
3940Sstevel@tonic-gate 	/*
3950Sstevel@tonic-gate 	 * Check for version of the profile the client is using
3960Sstevel@tonic-gate 	 *
3970Sstevel@tonic-gate 	 * For version 1 profiles we do use nisMap and nisObject schema
3980Sstevel@tonic-gate 	 * for backward compatibility with Solaris 8 clients.
3990Sstevel@tonic-gate 	 *
4000Sstevel@tonic-gate 	 * For version 2 profiles we use automountMap and automount as
4010Sstevel@tonic-gate 	 * default attributes (which can then be overridden in libsldap
4020Sstevel@tonic-gate 	 * if schema mapping is configured in the profile).
4030Sstevel@tonic-gate 	 *
4040Sstevel@tonic-gate 	 * If profile version is not available, use version 2 as default.
4050Sstevel@tonic-gate 	 */
4060Sstevel@tonic-gate 	rc = __ns_ldap_getParam(NS_LDAP_FILE_VERSION_P, &paramVal, &errorp);
4070Sstevel@tonic-gate 	if (rc != NS_LDAP_SUCCESS || !paramVal || !*paramVal) {
4080Sstevel@tonic-gate 		/* should print a message here: using v2 defaults */
4090Sstevel@tonic-gate 		(void) __ns_ldap_freeError(&errorp);
4100Sstevel@tonic-gate 	} else {
4110Sstevel@tonic-gate 		if (strcasecmp(*paramVal, NS_LDAP_VERSION_1) == 0)
4120Sstevel@tonic-gate 			v2 = 0;
4130Sstevel@tonic-gate 		(void) __ns_ldap_freeParam(&paramVal);
4140Sstevel@tonic-gate 	}
4150Sstevel@tonic-gate 
4160Sstevel@tonic-gate 	/*
4170Sstevel@tonic-gate 	 * starts at 2 to skip over publickey databases.
4180Sstevel@tonic-gate 	 * These databases are handled separately.
4190Sstevel@tonic-gate 	 */
4200Sstevel@tonic-gate 	for (i = 2; maplist[i].database != NULL; i++) {
4210Sstevel@tonic-gate 		if (strcasecmp(database, maplist[i].database) == SAME) {
4222830Sdjl 			dbpf = 0, dbtp = 0;
4232830Sdjl 			if (strcasecmp(database, "prof_attr") == 0)
4242830Sdjl 				dbpf = 1;
4252830Sdjl 			else if (strcasecmp(database, "tnrhtp") == 0)
4262830Sdjl 				dbtp = 1;
4270Sstevel@tonic-gate 			if ((keyfilter = set_keys(key, maplist[i].def_type))
428*12788Sgary.winiger@oracle.com 			    == NULL) {
4292830Sdjl 				filterlen = strlen(maplist[i].objectclass);
4301450Sjanga 				udatalen = 3;
4312830Sdjl 				if (dbpf)
4322830Sdjl 					filterlen += strlen(PROF_ATTR_FILTER)
433*12788Sgary.winiger@oracle.com 					    + 1;
4342830Sdjl 				else if (dbtp)
4352830Sdjl 					filterlen += strlen(TNRHTP_FILTER) + 1;
4362830Sdjl 				else
4372830Sdjl 					filterlen += OC_FLEN;
4382830Sdjl 
4391450Sjanga 				MALLOC_FILTER_UDATA(filter, filterlen, userdata,
440*12788Sgary.winiger@oracle.com 				    udatalen, nomem);
4412830Sdjl 				if (nomem)
4422830Sdjl 					goto done;
4432830Sdjl 				if (dbpf)
4441450Sjanga 					(void) snprintf(filter, filterlen,
445*12788Sgary.winiger@oracle.com 					    PROF_ATTR_FILTER, "");
4462830Sdjl 				else if (dbtp)
4472830Sdjl 					(void) snprintf(filter, filterlen,
448*12788Sgary.winiger@oracle.com 					    TNRHTP_FILTER, "");
4492830Sdjl 				else
4502830Sdjl 					(void) snprintf(filter, filterlen,
451*12788Sgary.winiger@oracle.com 					    OC_FILTER,
452*12788Sgary.winiger@oracle.com 					    maplist[i].objectclass);
4532830Sdjl 
4542830Sdjl 				(void) snprintf(userdata, udatalen, "%%s");
4550Sstevel@tonic-gate 			} else {
4561450Sjanga 				filterlen = strlen(maplist[i].objectclass) +
457*12788Sgary.winiger@oracle.com 				    strlen(keyfilter);
4582830Sdjl 				if (dbpf)
4592830Sdjl 					filterlen += strlen(PROF_ATTR_FILTER)
460*12788Sgary.winiger@oracle.com 					    + 1;
4612830Sdjl 				else if (dbtp)
4622830Sdjl 					filterlen += strlen(TNRHTP_FILTER) + 1;
4632830Sdjl 				else
4642830Sdjl 					filterlen += OC_FLEN2;
4652830Sdjl 
4661450Sjanga 				udatalen = strlen(keyfilter) + 8;
4671450Sjanga 				MALLOC_FILTER_UDATA(filter, filterlen, userdata,
468*12788Sgary.winiger@oracle.com 				    udatalen, nomem);
4692830Sdjl 				if (nomem)
4702830Sdjl 					goto done;
4712830Sdjl 				if (dbpf)
4722830Sdjl 					(void) snprintf(filter, filterlen,
473*12788Sgary.winiger@oracle.com 					    PROF_ATTR_FILTER, keyfilter);
4742830Sdjl 				else if (dbtp)
4751450Sjanga 					(void) snprintf(filter, filterlen,
476*12788Sgary.winiger@oracle.com 					    TNRHTP_FILTER, keyfilter);
4772830Sdjl 				else
4782830Sdjl 					(void) snprintf(filter, filterlen,
479*12788Sgary.winiger@oracle.com 					    OC_FILTER2,
480*12788Sgary.winiger@oracle.com 					    maplist[i].objectclass, keyfilter);
4812830Sdjl 
4822830Sdjl 				(void) snprintf(userdata, udatalen,
483*12788Sgary.winiger@oracle.com 				    "(&(%%s)%s)", keyfilter);
4840Sstevel@tonic-gate 			}
4851450Sjanga 			goto done;
4860Sstevel@tonic-gate 		}
4870Sstevel@tonic-gate 	}
4880Sstevel@tonic-gate 
4890Sstevel@tonic-gate 	/* special cases for automounter and other services */
4900Sstevel@tonic-gate 
4910Sstevel@tonic-gate 	/* auto_* services */
4920Sstevel@tonic-gate 	if (strncasecmp(database, "auto_", 5) == SAME) {
493*12788Sgary.winiger@oracle.com 		if (v2) {
494*12788Sgary.winiger@oracle.com 			if ((keyfilter = set_keys(key, "automountKey"))
495*12788Sgary.winiger@oracle.com 			    != NULL) {
496*12788Sgary.winiger@oracle.com 				filterlen = strlen(keyfilter) + 27;
497*12788Sgary.winiger@oracle.com 				udatalen = strlen(keyfilter) + 8;
498*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
499*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
500*12788Sgary.winiger@oracle.com 				if (!nomem) {
501*12788Sgary.winiger@oracle.com 					(void) snprintf(filter, filterlen,
502*12788Sgary.winiger@oracle.com 					    "(&(objectclass=automount)%s)",
503*12788Sgary.winiger@oracle.com 					    keyfilter);
504*12788Sgary.winiger@oracle.com 					(void) snprintf(userdata, udatalen,
505*12788Sgary.winiger@oracle.com 					    "(&(%%s)%s)", keyfilter);
506*12788Sgary.winiger@oracle.com 				}
507*12788Sgary.winiger@oracle.com 			} else {
508*12788Sgary.winiger@oracle.com 				filterlen = 22;
509*12788Sgary.winiger@oracle.com 				udatalen = 3;
510*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
511*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
512*12788Sgary.winiger@oracle.com 				if (!nomem) {
513*12788Sgary.winiger@oracle.com 					(void) strlcpy(filter,
514*12788Sgary.winiger@oracle.com 					    "objectclass=automount", filterlen);
515*12788Sgary.winiger@oracle.com 					(void) strlcpy(userdata, "%s",
516*12788Sgary.winiger@oracle.com 					    udatalen);
517*12788Sgary.winiger@oracle.com 				}
5181450Sjanga 			}
5190Sstevel@tonic-gate 		} else {
520*12788Sgary.winiger@oracle.com 			if ((keyfilter = set_keys(key, "cn")) != NULL) {
521*12788Sgary.winiger@oracle.com 				filterlen = strlen(keyfilter) + 27;
522*12788Sgary.winiger@oracle.com 				udatalen = strlen(keyfilter) + 8;
523*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
524*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
525*12788Sgary.winiger@oracle.com 				if (!nomem) {
526*12788Sgary.winiger@oracle.com 					(void) snprintf(filter, filterlen,
527*12788Sgary.winiger@oracle.com 					    "(&(objectclass=nisObject)%s)",
528*12788Sgary.winiger@oracle.com 					    keyfilter);
529*12788Sgary.winiger@oracle.com 					(void) snprintf(userdata, udatalen,
530*12788Sgary.winiger@oracle.com 					    "(&(%%s)%s)", keyfilter);
531*12788Sgary.winiger@oracle.com 				}
532*12788Sgary.winiger@oracle.com 			} else {
533*12788Sgary.winiger@oracle.com 				filterlen = 22;
534*12788Sgary.winiger@oracle.com 				udatalen = 3;
535*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
536*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
537*12788Sgary.winiger@oracle.com 				if (!nomem) {
538*12788Sgary.winiger@oracle.com 					(void) strlcpy(filter,
539*12788Sgary.winiger@oracle.com 					    "objectclass=nisObject", filterlen);
540*12788Sgary.winiger@oracle.com 					(void) strlcpy(userdata, "%s",
541*12788Sgary.winiger@oracle.com 					    udatalen);
542*12788Sgary.winiger@oracle.com 				}
5431450Sjanga 			}
5440Sstevel@tonic-gate 		}
545*12788Sgary.winiger@oracle.com 		goto done;
5460Sstevel@tonic-gate 	}
5470Sstevel@tonic-gate 
5480Sstevel@tonic-gate 	/* automount service */
5490Sstevel@tonic-gate 	if (strcasecmp(database, "automount") == SAME) {
550*12788Sgary.winiger@oracle.com 		if (v2) {
551*12788Sgary.winiger@oracle.com 			if ((keyfilter = set_keys(key, "automountMapName"))
552*12788Sgary.winiger@oracle.com 			    != NULL) {
553*12788Sgary.winiger@oracle.com 				filterlen = strlen(keyfilter) + 30;
554*12788Sgary.winiger@oracle.com 				udatalen = strlen(keyfilter) + 8;
555*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
556*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
557*12788Sgary.winiger@oracle.com 				if (!nomem) {
558*12788Sgary.winiger@oracle.com 					(void) snprintf(filter, filterlen,
559*12788Sgary.winiger@oracle.com 					    "(&(objectclass=automountMap)%s)",
560*12788Sgary.winiger@oracle.com 					    keyfilter);
561*12788Sgary.winiger@oracle.com 					(void) snprintf(userdata, udatalen,
562*12788Sgary.winiger@oracle.com 					    "(&(%%s)%s)", keyfilter);
563*12788Sgary.winiger@oracle.com 				}
564*12788Sgary.winiger@oracle.com 			} else {
565*12788Sgary.winiger@oracle.com 				filterlen = 25;
566*12788Sgary.winiger@oracle.com 				udatalen = 3;
567*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
568*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
569*12788Sgary.winiger@oracle.com 				if (!nomem) {
570*12788Sgary.winiger@oracle.com 					(void) strlcpy(filter,
571*12788Sgary.winiger@oracle.com 					    "objectclass=automountMap",
572*12788Sgary.winiger@oracle.com 					    filterlen);
573*12788Sgary.winiger@oracle.com 					(void) strlcpy(userdata, "%s",
574*12788Sgary.winiger@oracle.com 					    udatalen);
575*12788Sgary.winiger@oracle.com 				}
5761450Sjanga 			}
5770Sstevel@tonic-gate 		} else {
578*12788Sgary.winiger@oracle.com 			if ((keyfilter = set_keys(key, "nisMapName"))
579*12788Sgary.winiger@oracle.com 			    != NULL) {
580*12788Sgary.winiger@oracle.com 				filterlen = strlen(keyfilter) + 24;
581*12788Sgary.winiger@oracle.com 				udatalen = strlen(keyfilter) + 8;
582*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
583*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
584*12788Sgary.winiger@oracle.com 				if (!nomem) {
585*12788Sgary.winiger@oracle.com 					(void) snprintf(filter, filterlen,
586*12788Sgary.winiger@oracle.com 					    "(&(objectclass=nisMap)%s)",
587*12788Sgary.winiger@oracle.com 					    keyfilter);
588*12788Sgary.winiger@oracle.com 					(void) snprintf(userdata, udatalen,
589*12788Sgary.winiger@oracle.com 					    "(&(%%s)%s)", keyfilter);
590*12788Sgary.winiger@oracle.com 				}
591*12788Sgary.winiger@oracle.com 			} else {
592*12788Sgary.winiger@oracle.com 				filterlen = 19;
593*12788Sgary.winiger@oracle.com 				udatalen = 3;
594*12788Sgary.winiger@oracle.com 				MALLOC_FILTER_UDATA(filter, filterlen,
595*12788Sgary.winiger@oracle.com 				    userdata, udatalen, nomem);
596*12788Sgary.winiger@oracle.com 				if (!nomem) {
597*12788Sgary.winiger@oracle.com 					(void) strlcpy(filter,
598*12788Sgary.winiger@oracle.com 					    "objectclass=nisMap", filterlen);
599*12788Sgary.winiger@oracle.com 					(void) strlcpy(userdata, "%s",
600*12788Sgary.winiger@oracle.com 					    udatalen);
601*12788Sgary.winiger@oracle.com 				}
6021450Sjanga 			}
6030Sstevel@tonic-gate 		}
604*12788Sgary.winiger@oracle.com 		goto done;
6050Sstevel@tonic-gate 	}
6060Sstevel@tonic-gate 
6070Sstevel@tonic-gate 	/* other services (catch all) */
6080Sstevel@tonic-gate 	if ((keyfilter = set_keys(key, "cn")) == NULL) {
6091450Sjanga 		filterlen = 14;
6101450Sjanga 		udatalen = 3;
611*12788Sgary.winiger@oracle.com 		MALLOC_FILTER_UDATA(filter, filterlen, userdata, udatalen,
612*12788Sgary.winiger@oracle.com 		    nomem);
6131450Sjanga 		if (!nomem) {
6141450Sjanga 			(void) snprintf(filter, filterlen, "objectclass=*");
6151450Sjanga 			(void) strlcpy(userdata, "%s", udatalen);
6161450Sjanga 		}
6170Sstevel@tonic-gate 	} else {
6181450Sjanga 		filterlen = strlen(keyfilter) + 1;
6191450Sjanga 		udatalen = strlen(keyfilter) + 8;
620*12788Sgary.winiger@oracle.com 		MALLOC_FILTER_UDATA(filter, filterlen, userdata, udatalen,
621*12788Sgary.winiger@oracle.com 		    nomem);
6221450Sjanga 		if (!nomem) {
6231450Sjanga 			(void) snprintf(filter, filterlen, "%s", keyfilter);
6241450Sjanga 			(void) snprintf(userdata, udatalen, "(&(%%s)%s)",
625*12788Sgary.winiger@oracle.com 			    keyfilter);
6261450Sjanga 		}
6270Sstevel@tonic-gate 	}
6280Sstevel@tonic-gate 
6290Sstevel@tonic-gate done:
6300Sstevel@tonic-gate #ifdef DEBUG
6311450Sjanga 	(void) fprintf(stdout, "set_filter: filter=\"%s\"\n", filter);
6321450Sjanga 	(void) fprintf(stdout, "set_filter: userdata=\"%s\"\n", userdata);
6330Sstevel@tonic-gate #endif /* DEBUG */
6341450Sjanga 	if (keyfilter)
6351450Sjanga 		free(keyfilter);
6361450Sjanga 	if (nomem)
6371450Sjanga 		exit(2);
6381450Sjanga 	*udata = userdata;
6390Sstevel@tonic-gate 	return (filter);
6400Sstevel@tonic-gate }
641