getprojent.c revision 2830:5228d1267a01
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 2006 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#pragma ident	"%Z%%M%	%I%	%E% SMI"
27
28#include <project.h>
29#include "ldap_common.h"
30
31/* Project attributes filters */
32#define	_PROJ_NAME	"SolarisProjectName"
33#define	_PROJ_PROJID	"SolarisProjectID"
34#define	_PROJ_DESCR	"description"
35#define	_PROJ_USERS	"memberUid"
36#define	_PROJ_GROUPS	"memberGid"
37#define	_PROJ_ATTR	"SolarisProjectAttr"
38
39#define	_F_GETPROJNAME	"(&(objectClass=SolarisProject)(SolarisProjectName=%s))"
40#define	_F_GETPROJID	"(&(objectClass=SolarisProject)(SolarisProjectID=%ld))"
41
42static const char *project_attrs[] = {
43	_PROJ_NAME,
44	_PROJ_PROJID,
45	_PROJ_DESCR,
46	_PROJ_USERS,
47	_PROJ_GROUPS,
48	_PROJ_ATTR,
49	(char *)NULL
50};
51
52/*
53 * _nss_ldap_proj2str is the data marshalling method for the project getXbyY
54 * (getprojbyname, getprojbyid, getprojent) backend processes. This method
55 * is called after a successful ldap search has been performed. This method
56 * will parse the ldap search values into the file format.
57 * e.g.
58 *
59 * system:0:System:::
60 *
61 * beatles:100:The Beatles:john,paul,george,ringo::task.max-lwps=
62 * 	(privileged,100,signal=SIGTERM),(privileged,110,deny)
63 *
64 * (All in one line)
65 */
66static int
67_nss_ldap_proj2str(ldap_backend_ptr be, nss_XbyY_args_t *argp)
68{
69	int nss_result, buflen;
70	unsigned long len = 0;
71	char *buffer, *comment, *user_str, *group_str, *attr_str;
72	ns_ldap_result_t *result = be->result;
73	char **name, **id, **descr, **users, **groups, **attr;
74
75	if (result == NULL)
76		return (NSS_STR_PARSE_PARSE);
77	buflen = argp->buf.buflen;
78
79	nss_result = NSS_STR_PARSE_SUCCESS;
80	(void) memset(argp->buf.buffer, 0, buflen);
81
82	name = __ns_ldap_getAttr(result->entry, _PROJ_NAME);
83	if (name == NULL || name[0] == NULL || (strlen(name[0]) < 1)) {
84		nss_result = NSS_STR_PARSE_PARSE;
85		goto result_proj2str;
86	}
87	id = __ns_ldap_getAttr(result->entry, _PROJ_PROJID);
88	if (id == NULL || id[0] == NULL || (strlen(id[0]) < 1)) {
89		nss_result = NSS_STR_PARSE_PARSE;
90		goto result_proj2str;
91	}
92	descr = __ns_ldap_getAttr(result->entry, _PROJ_DESCR);
93	if (descr == NULL || descr[0] == NULL || (strlen(descr[0]) < 1))
94		comment = _NO_VALUE;
95
96	else
97		comment = descr[0];
98
99	users = __ns_ldap_getAttr(result->entry, _PROJ_USERS);
100	if (users == NULL || users[0] == NULL || (strlen(users[0]) < 1))
101		user_str = _NO_VALUE;
102
103	else
104		user_str = users[0];
105
106	groups = __ns_ldap_getAttr(result->entry, _PROJ_GROUPS);
107	if (groups == NULL || groups[0] == NULL || (strlen(groups[0]) < 1))
108		group_str = _NO_VALUE;
109
110	else
111		group_str = groups[0];
112
113	attr = __ns_ldap_getAttr(result->entry, _PROJ_ATTR);
114	if (attr == NULL || attr[0] == NULL || (strlen(attr[0]) < 1))
115		attr_str = _NO_VALUE;
116
117	else
118		attr_str = attr[0];
119
120	/* 6 = 5 ':' + 1 '\0' */
121	len = strlen(name[0]) + strlen(id[0]) + strlen(comment) +
122		strlen(user_str) + strlen(group_str) + strlen(attr_str) + 6;
123	if (len >= buflen) {
124		nss_result = NSS_STR_PARSE_ERANGE;
125		goto result_proj2str;
126	}
127	if (argp->buf.result != NULL) {
128		if ((be->buffer = calloc(1, len)) == NULL) {
129			nss_result = NSS_STR_PARSE_PARSE;
130			goto result_proj2str;
131		}
132		buffer = be->buffer;
133		/* The front end marshaller does not need trailing nulls */
134		be->buflen = len - 1;
135	} else
136		buffer = argp->buf.buffer;
137
138	(void) snprintf(buffer, len, "%s:%s:%s:%s:%s:%s", name[0], id[0],
139			comment, user_str, group_str, attr_str);
140
141result_proj2str:
142	(void) __ns_ldap_freeResult(&be->result);
143	return ((int)nss_result);
144}
145
146
147/*
148 * getbyname gets a project entry by name. This function constructs an ldap
149 * search filter using the name invocation parameter and the getprojname search
150 * filter defined. Once the filter is constructed, we search for a matching
151 * entry and marshal the data results into struct project for the frontend
152 * process. The function _nss_ldap_proj2ent performs the data marshaling.
153 */
154static nss_status_t
155getbyname(ldap_backend_ptr be, void *a)
156{
157	nss_XbyY_args_t	*argp = (nss_XbyY_args_t *)a;
158	char searchfilter[SEARCHFILTERLEN];
159
160	if (snprintf(searchfilter, SEARCHFILTERLEN,
161		_F_GETPROJNAME, argp->key.name) < 0)
162		return (NSS_NOTFOUND);
163	return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL,
164			NULL, NULL));
165}
166
167
168/*
169 * getbyprojid gets a project entry by number. This function constructs an ldap
170 * search filter using the name invocation parameter and the getprojid search
171 * filter defined. Once the filter is constructed, we search for a matching
172 * entry and marshal the data results into struct project for the frontend
173 * process. The function _nss_ldap_proj2ent performs the data marshaling.
174 */
175static nss_status_t
176getbyprojid(ldap_backend_ptr be, void *a)
177{
178	nss_XbyY_args_t	*argp = (nss_XbyY_args_t *)a;
179	char searchfilter[SEARCHFILTERLEN];
180
181	if (snprintf(searchfilter, SEARCHFILTERLEN,
182		_F_GETPROJID, (long)argp->key.projid) < 0)
183		return (NSS_NOTFOUND);
184	return (_nss_ldap_lookup(be, argp, _PROJECT, searchfilter, NULL,
185			NULL, NULL));
186}
187
188static ldap_backend_op_t project_ops[] = {
189	_nss_ldap_destr,
190	_nss_ldap_endent,
191	_nss_ldap_setent,
192	_nss_ldap_getent,
193	getbyname,
194	getbyprojid
195};
196
197
198/*ARGSUSED0*/
199nss_backend_t *
200_nss_ldap_project_constr(const char *dummy1, const char *dummy2,
201    const char *dummy3)
202{
203	return (_nss_ldap_constr(project_ops,
204	    sizeof (project_ops) / sizeof (project_ops[0]),
205	    _PROJECT, project_attrs, _nss_ldap_proj2str));
206}
207