preparing for release of alpha-2.6
[Samba/gbeck.git] / source / groupdb / builtinnt5ldap.c
blob20b8c296a3f5e710562db3ba065e816b4f1d74b8
2 /*
3 Unix SMB/Netbios implementation.
4 Version 2.0.
5 LDAP builtin group database for SAMBA
6 Copyright (C) Matthew Chapman 1998
7 Copyright (C) Luke Howard 2000
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "includes.h"
27 #ifdef WITH_NT5LDAP
29 #include <lber.h>
30 #include <ldap.h>
31 #include "ldapdb.h"
32 #include "sids.h"
34 extern int DEBUGLEVEL;
36 /* Static structure filled for requests */
37 static LOCAL_GRP localgrp;
40 /***************************************************************
41 Begin/end smbgrp enumeration.
42 ****************************************************************/
44 static void *
45 nt5ldapbuiltin_enumfirst (BOOL update)
47 LDAPDB_DECLARE_HANDLE (hds);
48 fstring filter;
50 if (!ldapdb_open (&hds))
52 return NULL;
55 slprintf (filter, sizeof (filter) - 1, "(&(objectClass=Group)(groupType=%d))",
56 NTDS_GROUP_TYPE_BUILTIN_GROUP | NTDS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | NTDS_GROUP_TYPE_SECURITY_ENABLED);
57 if (!ldapdb_search (hds, NULL, filter, NULL, LDAP_NO_LIMIT))
59 ldapdb_close (&hds);
60 return NULL;
63 return hds;
66 static void
67 nt5ldapbuiltin_enumclose (void *vp)
69 LDAPDB *hds = (LDAPDB *) vp;
71 ldapdb_close (&hds);
72 return;
76 /*************************************************************************
77 Save/restore the current position in a query
78 *************************************************************************/
80 static SMB_BIG_UINT
81 nt5ldapbuiltin_getdbpos (void *vp)
83 return 0;
86 static BOOL
87 nt5ldapbuiltin_setdbpos (void *vp, SMB_BIG_UINT tok)
89 return False;
93 /*************************************************************************
94 Return limited smb_passwd information, and group membership.
95 *************************************************************************/
97 static LOCAL_GRP *
98 nt5ldapbuiltin_getgrpbynam (const char *name,
99 LOCAL_GRP_MEMBER ** members, int *num_membs)
101 fstring filter;
102 BOOL ret;
103 LDAPDB_DECLARE_HANDLE (hds);
105 if (!ldapdb_open (&hds))
107 return (NULL);
110 slprintf (filter, sizeof (filter) - 1,
111 "(&(objectClass=Group)(sAMAccountName=%s)(groupType=%d))", name,
112 NTDS_GROUP_TYPE_BUILTIN_GROUP | NTDS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | NTDS_GROUP_TYPE_SECURITY_ENABLED);
113 if (!ldapdb_search (hds, NULL, filter, NULL, 1))
115 ldapdb_close (&hds);
116 return NULL;
119 ret = nt5ldap_make_local_grp (hds, &localgrp, members, num_membs, NTDS_GROUP_TYPE_BUILTIN_GROUP);
121 ldapdb_close (&hds);
123 return ret ? &localgrp : NULL;
126 static LOCAL_GRP *
127 nt5ldapbuiltin_getgrpbygid (gid_t grp_id,
128 LOCAL_GRP_MEMBER ** members, int *num_membs)
130 fstring filter;
131 BOOL ret;
132 LDAPDB_DECLARE_HANDLE (hds);
134 if (!ldapdb_open (&hds))
136 return (NULL);
139 slprintf (filter, sizeof (filter) - 1,
140 "(&(objectClass=Group)(gidNumber=%d)(groupType=%d))", grp_id,
141 NTDS_GROUP_TYPE_BUILTIN_GROUP | NTDS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | NTDS_GROUP_TYPE_SECURITY_ENABLED);
142 if (!ldapdb_search (hds, NULL, filter, NULL, 1))
144 ldapdb_close (&hds);
145 return NULL;
148 ret = nt5ldap_make_local_grp (hds, &localgrp, members, num_membs, NTDS_GROUP_TYPE_BUILTIN_GROUP);
150 ldapdb_close (&hds);
152 return ret ? &localgrp : NULL;
155 static LOCAL_GRP *
156 nt5ldapbuiltin_getgrpbyrid (uint32 grp_rid,
157 LOCAL_GRP_MEMBER ** members, int *num_membs)
159 fstring filter;
160 fstring sidfilter;
161 BOOL ret;
162 LDAPDB_DECLARE_HANDLE (hds);
164 if (!ldapdb_make_rid_filter ("objectSid", grp_rid, sidfilter))
166 return NULL;
169 if (!ldapdb_open (&hds))
171 return NULL;
174 slprintf (filter, sizeof (filter) - 1,
175 "(&(objectClass=Group)(%s)(groupType=%d))", sidfilter,
176 NTDS_GROUP_TYPE_BUILTIN_GROUP | NTDS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | NTDS_GROUP_TYPE_SECURITY_ENABLED);
177 if (!ldapdb_search (hds, NULL, filter, NULL, 1))
179 ldapdb_close (&hds);
180 return NULL;
183 ret = nt5ldap_make_local_grp (hds, &localgrp, members, num_membs, NTDS_GROUP_TYPE_BUILTIN_GROUP);
185 ldapdb_close (&hds);
187 return ret ? &localgrp : NULL;
190 static LOCAL_GRP *
191 nt5ldapbuiltin_getcurrentgrp (void *vp,
192 LOCAL_GRP_MEMBER ** members, int *num_membs)
194 BOOL ret = False;
198 if ((ret = nt5ldap_make_local_grp ((LDAPDB *)vp, &localgrp, members, num_membs, NTDS_GROUP_TYPE_BUILTIN_GROUP)))
199 break;
201 while (ldapdb_seq((LDAPDB *)vp) == True);
203 return ret ? &localgrp : NULL;
207 /*************************************************************************
208 Add/modify/delete builtin aliases.
209 *************************************************************************/
211 static BOOL
212 nt5ldapbuiltin_addgrp (LOCAL_GRP * group)
214 LDAPMod **mods = NULL;
215 LDAPDB_DECLARE_HANDLE (hds);
216 BOOL ret;
218 if (!ldapdb_open (&hds))
220 return False;
223 if (!ldapdb_allocate_rid (hds, &group->rid))
225 DEBUG (0, ("RID generation failed\n"));
226 return False;
229 if (!nt5ldap_local_grp_mods (group, &mods, LDAP_MOD_ADD, NTDS_GROUP_TYPE_BUILTIN_GROUP))
231 ret = False;
233 else
235 ret = ldapdb_update (hds, lp_ldap_builtin_subcontext (), "cn", group->name, mods, True);
238 ldapdb_close (&hds);
240 return ret;
243 static BOOL
244 nt5ldapbuiltin_modgrp (LOCAL_GRP * group)
246 LDAPMod **mods = NULL;
247 LDAPDB_DECLARE_HANDLE (hds);
248 BOOL ret;
250 if (!ldapdb_open (&hds))
252 return False;
255 if (!nt5ldap_local_grp_mods (group, &mods, LDAP_MOD_REPLACE, NTDS_GROUP_TYPE_BUILTIN_GROUP))
257 ret = False;
259 else
261 ret = ldapdb_update (hds, lp_ldap_builtin_subcontext (), "cn", group->name, mods, False);
264 ldapdb_close (&hds);
266 return ret;
269 static BOOL
270 nt5ldapbuiltin_delgrp (uint32 grp_rid)
272 pstring dn;
273 LDAPDB_DECLARE_HANDLE (hds);
274 BOOL ret;
276 if (!ldapdb_open (&hds))
278 return False;
281 if (!ldapdb_rid_to_dn (hds, grp_rid, dn))
283 ldapdb_close (&hds);
284 return False;
287 ret = ldapdb_delete (hds, dn);
289 ldapdb_close (&hds);
291 return ret;
295 /*************************************************************************
296 Add users to/remove users from aliases.
297 *************************************************************************/
299 static BOOL
300 nt5ldapbuiltin_addmem (uint32 grp_rid, const DOM_SID * user_sid)
302 LDAPMod **mods = NULL;
303 LDAPDB_DECLARE_HANDLE (hds);
304 BOOL ret;
305 pstring userdn, groupdn;
307 if (!ldapdb_open (&hds))
309 return False;
312 if (!ldapdb_rid_to_dn (hds, grp_rid, groupdn))
314 ldapdb_close (&hds);
315 return False;
318 if (!nt5ldap_local_grp_member_mods (user_sid, &mods, LDAP_MOD_ADD, userdn))
320 ret = False;
322 else
324 ret = ldapdb_commit (hds, groupdn, mods, False);
327 if (ret == True)
329 mods = NULL;
330 ret = ldapdb_queue_mod (&mods, LDAP_MOD_ADD, "memberOf", groupdn) &&
331 ldapdb_commit (hds, userdn, mods, False);
334 ldapdb_close (&hds);
336 return ret;
339 static BOOL
340 nt5ldapbuiltin_delmem (uint32 grp_rid, const DOM_SID * user_sid)
342 LDAPMod **mods = NULL;
343 LDAPDB_DECLARE_HANDLE (hds);
344 BOOL ret;
345 pstring userdn, groupdn;
347 if (!ldapdb_open (&hds))
349 return False;
352 if (!ldapdb_rid_to_dn (hds, grp_rid, groupdn))
354 ldapdb_close (&hds);
355 return False;
358 if (!nt5ldap_local_grp_member_mods (user_sid, &mods, LDAP_MOD_DELETE, userdn))
360 ret = False;
362 else
364 ret = ldapdb_commit (hds, groupdn, mods, False);
367 if (ret == True)
369 mods = NULL;
370 ret = ldapdb_queue_mod (&mods, LDAP_MOD_DELETE, "memberOf", groupdn) &&
371 ldapdb_commit (hds, userdn, mods, False);
374 ldapdb_close (&hds);
376 return ret;
380 /*************************************************************************
381 Return builtin aliases that a user is in.
382 *************************************************************************/
384 static BOOL
385 nt5ldapbuiltin_getusergroups (const char *name, LOCAL_GRP ** groups,
386 int *num_grps)
388 LOCAL_GRP *grouplist;
389 fstring filter;
390 int i, ngroups;
391 pstring dn;
392 LDAPDB_DECLARE_HANDLE (hds);
394 if (!ldapdb_open (&hds))
396 return False;
399 if (!ldapdb_ntname_to_dn (hds, name, dn))
401 ldapdb_close (&hds);
402 return False;
405 slprintf (filter, sizeof (pstring) - 1, "(&(objectclass=Group)(member=%s)(groupType=%d))", dn,
406 NTDS_GROUP_TYPE_BUILTIN_GROUP | NTDS_GROUP_TYPE_DOMAIN_LOCAL_GROUP | NTDS_GROUP_TYPE_SECURITY_ENABLED);
408 (void) ldapdb_set_synchronous (hds, True);
409 if (!ldapdb_search (hds, NULL, filter, NULL, LDAP_NO_LIMIT))
411 ldapdb_close (&hds);
412 return False;
415 if (!ldapdb_count_entries (hds, &ngroups))
417 ldapdb_close (&hds);
418 return False;
421 grouplist = calloc (ngroups, sizeof (LOCAL_GRP));
422 if (grouplist == NULL)
424 ldapdb_close (&hds);
425 return False;
428 *num_grps = 0;
430 for (i = 0; i < ngroups; i++)
432 if (nt5ldap_make_local_grp (hds, &grouplist[*num_grps], NULL, NULL, NTDS_GROUP_TYPE_BUILTIN_GROUP))
434 (*num_grps)++;
436 if (!ldapdb_seq (hds))
438 break;
442 ldapdb_close (&hds);
444 *groups = grouplist;
446 return True;
450 static struct aliasdb_ops nt5ldapbuiltin_ops =
452 nt5ldapbuiltin_enumfirst,
453 nt5ldapbuiltin_enumclose,
454 nt5ldapbuiltin_getdbpos,
455 nt5ldapbuiltin_setdbpos,
457 nt5ldapbuiltin_getgrpbynam,
458 nt5ldapbuiltin_getgrpbygid,
459 nt5ldapbuiltin_getgrpbyrid,
460 nt5ldapbuiltin_getcurrentgrp,
462 nt5ldapbuiltin_addgrp,
463 nt5ldapbuiltin_modgrp,
464 nt5ldapbuiltin_delgrp,
466 nt5ldapbuiltin_addmem,
467 nt5ldapbuiltin_delmem,
469 nt5ldapbuiltin_getusergroups
472 struct aliasdb_ops *
473 nt5ldap_initialise_builtin_db (void)
475 return &nt5ldapbuiltin_ops;
478 #else
479 void builtinnt5ldap_dummy_function (void);
480 void
481 builtinnt5ldap_dummy_function (void)
483 } /* stop some compilers complaining */
484 #endif