2 Unix SMB/Netbios implementation.
4 LDAP local group database for SAMBA
5 Copyright (C) Matthew Chapman 1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 extern int DEBUGLEVEL;
33 extern LDAP *ldap_struct;
34 extern LDAPMessage *ldap_results;
35 extern LDAPMessage *ldap_entry;
37 /* Static structure filled for requests */
38 static LOCAL_GRP localgrp;
41 /***************************************************************
42 Get group and membership information.
43 ****************************************************************/
45 static LOCAL_GRP *ldapalias_getgrp(LOCAL_GRP *group,
46 LOCAL_GRP_MEMBER **members, int *num_membs)
50 LOCAL_GRP_MEMBER *memblist;
57 if(!ldap_get_attribute("cn", group->name)) {
58 DEBUG(0, ("Missing cn\n"));
61 DEBUG(2,("Retrieving alias [%s]\n", group->name));
63 if(ldap_get_attribute("rid", temp)) {
64 group->rid = atoi(temp);
66 DEBUG(0, ("Missing rid\n"));
70 if(!ldap_get_attribute("description", group->comment))
71 group->comment[0] = 0;
73 if(!members || !num_membs) {
74 ldap_entry = ldap_next_entry(ldap_struct, ldap_entry);
78 if(values = ldap_get_values(ldap_struct, ldap_entry, "member")) {
80 *num_membs = i = ldap_count_values(values);
81 *members = memblist = malloc(i * sizeof(LOCAL_GRP_MEMBER));
86 if(!(sep = strchr(value, ','))) {
87 DEBUG(0, ("Malformed alias member\n"));
91 fstrcpy(memblist[i].name, value);
93 if(!(value = strchr(sep, ','))) {
94 DEBUG(0, ("Malformed alias member\n"));
98 string_to_sid(&memblist[i].sid, sep);
100 if((memblist[i].sid_use = atoi(value))
102 DEBUG(0, ("Invalid SID use in alias"));
106 ldap_value_free(values);
117 /************************************************************************
118 Queues the necessary modifications to save a LOCAL_GRP structure
119 ************************************************************************/
121 static void ldapalias_grpmods(LOCAL_GRP *group, LDAPMod ***mods, int operation)
127 if(operation == LDAP_MOD_ADD) { /* immutable attributes */
128 ldap_make_mod(mods, LDAP_MOD_ADD, "objectClass", "sambaAlias");
129 ldap_make_mod(mods, LDAP_MOD_ADD, "cn", group->name);
131 slprintf(temp, sizeof(temp)-1, "%d", (gid_t)(-1));
132 ldap_make_mod(mods, LDAP_MOD_ADD, "gidNumber", temp);
134 slprintf(temp, sizeof(temp)-1, "%d", group->rid);
135 ldap_make_mod(mods, LDAP_MOD_ADD, "rid", temp);
138 ldap_make_mod(mods, operation, "description", group->comment);
142 /***************************************************************
143 Begin/end smbgrp enumeration.
144 ****************************************************************/
146 static void *ldapalias_enumfirst(BOOL update)
148 if (lp_server_role() == ROLE_DOMAIN_NONE)
151 if (!ldap_open_connection(False))
154 ldap_search_for("objectClass=sambaAlias");
159 static void ldapalias_enumclose(void *vp)
161 ldap_close_connection();
165 /*************************************************************************
166 Save/restore the current position in a query
167 *************************************************************************/
169 static SMB_BIG_UINT ldapalias_getdbpos(void *vp)
171 return (SMB_BIG_UINT)((ulong)ldap_entry);
174 static BOOL ldapalias_setdbpos(void *vp, SMB_BIG_UINT tok)
176 ldap_entry = (LDAPMessage *)((ulong)tok);
181 /*************************************************************************
182 Return limited smb_passwd information, and group membership.
183 *************************************************************************/
185 static LOCAL_GRP *ldapalias_getgrpbynam(const char *name,
186 LOCAL_GRP_MEMBER **members, int *num_membs)
191 if(!ldap_open_connection(False))
194 slprintf(filter, sizeof(filter)-1,
195 "(&(cn=%s)(objectClass=sambaAlias))", name);
196 ldap_search_for(filter);
198 ret = ldapalias_getgrp(&localgrp, members, num_membs);
200 ldap_close_connection();
204 static LOCAL_GRP *ldapalias_getgrpbygid(gid_t grp_id,
205 LOCAL_GRP_MEMBER **members, int *num_membs)
210 if(!ldap_open_connection(False))
213 slprintf(filter, sizeof(filter)-1,
214 "(&(gidNumber=%d)(objectClass=sambaAlias))", grp_id);
215 ldap_search_for(filter);
216 ret = ldapalias_getgrp(&localgrp, members, num_membs);
218 ldap_close_connection();
222 static LOCAL_GRP *ldapalias_getgrpbyrid(uint32 grp_rid,
223 LOCAL_GRP_MEMBER **members, int *num_membs)
228 if(!ldap_open_connection(False))
231 slprintf(filter, sizeof(filter)-1,
232 "(&(rid=%d)(objectClass=sambaAlias))", grp_rid);
233 ldap_search_for(filter);
234 ret = ldapalias_getgrp(&localgrp, members, num_membs);
236 ldap_close_connection();
240 static LOCAL_GRP *ldapalias_getcurrentgrp(void *vp,
241 LOCAL_GRP_MEMBER **members, int *num_membs)
243 return ldapalias_getgrp(&localgrp, members, num_membs);
246 static BOOL ldapalias_addgrp(LOCAL_GRP *group)
250 ldapalias_grpmods(group, &mods, LDAP_MOD_ADD);
251 return ldap_makemods("cn", group->name, mods, True);
254 static BOOL ldapalias_modgrp(LOCAL_GRP *group)
258 ldapalias_grpmods(group, &mods, LDAP_MOD_REPLACE);
259 return ldap_makemods("cn", group->name, mods, False);
262 static BOOL ldapalias_getusergroups(const char *name, LOCAL_GRP **groups,
265 LOCAL_GRP *grouplist;
269 slprintf(filter, sizeof(pstring)-1,
270 "(&(member=%s,*)(objectclass=sambaAlias))", name);
271 ldap_search_for(filter);
273 *num_grps = i = ldap_count_entries(ldap_struct, ldap_results);
280 *groups = grouplist = malloc(i * sizeof(LOCAL_GRP));
283 } while(ldapalias_getgrp(&grouplist[i], NULL, NULL) && (i > 0));
289 static struct aliasdb_ops ldapalias_ops =
296 ldapalias_getgrpbynam,
297 ldapalias_getgrpbygid,
298 ldapalias_getgrpbyrid,
299 ldapalias_getcurrentgrp,
304 ldapalias_getusergroups
307 struct aliasdb_ops *ldap_initialise_alias_db(void)
309 return &ldapalias_ops;
313 void aliasldap_dummy_function(void);
314 void aliasldap_dummy_function(void) { } /* stop some compilers complaining */