9f00582592fd054794d35312a6d021e21d7546ca
[samba.git] / source3 / groupdb / builtinunix.c
1 /*
2  * Unix SMB/Netbios implementation. Version 1.9. SMB parameters and setup
3  * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License as published by the Free
7  * Software Foundation; either version 2 of the License, or (at your option)
8  * any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  * 
15  * You should have received a copy of the GNU General Public License along with
16  * this program; if not, write to the Free Software Foundation, Inc., 675
17  * Mass Ave, Cambridge, MA 02139, USA.
18  */
19
20 #include "includes.h"
21
22 #ifdef USE_SMBUNIX_DB
23
24 extern int DEBUGLEVEL;
25
26 struct unix_entries
27 {
28         struct group *grps;
29         int num_grps;
30         int grp_idx;
31 };
32
33 extern DOM_SID global_sid_S_1_5_20;
34 extern DOM_SID global_sam_sid;
35 extern fstring global_sam_name;
36
37 /***************************************************************
38  Start to enumerate the bltpasswd list. Returns a void pointer
39  to ensure no modification outside this module.
40 ****************************************************************/
41
42 static void *startbltunixpwent(BOOL update)
43 {
44         struct unix_entries *grps;
45         grps = (struct unix_entries*)malloc(sizeof(struct unix_entries));
46
47         if (grps == NULL)
48         {
49                 return NULL;
50         }
51
52         if (!get_unix_grps(&grps->num_grps, &grps->grps))
53         {
54                 free(grps);
55                 return NULL;
56         }
57
58         grps->grp_idx = 0;
59
60         return (void*)grps;
61 }
62
63 /***************************************************************
64  End enumeration of the bltpasswd list.
65 ****************************************************************/
66
67 static void endbltunixpwent(void *vp)
68 {
69         struct unix_entries *grps = (struct unix_entries *)vp;
70
71         if (grps != NULL)
72         {
73                 free_unix_grps(grps->num_grps, grps->grps);
74                 free(vp);
75         }
76 }
77
78 /*************************************************************************
79  Return the current position in the bltpasswd list as an SMB_BIG_UINT.
80  This must be treated as an opaque token.
81 *************************************************************************/
82 static SMB_BIG_UINT getbltunixpwpos(void *vp)
83 {
84         return (SMB_BIG_UINT)0;
85 }
86
87 /*************************************************************************
88  Set the current position in the bltpasswd list from an SMB_BIG_UINT.
89  This must be treated as an opaque token.
90 *************************************************************************/
91 static BOOL setbltunixpwpos(void *vp, SMB_BIG_UINT tok)
92 {
93         return False;
94 }
95
96 /*************************************************************************
97  Routine to return the next entry in the smbdomainbuiltin list.
98  *************************************************************************/
99 BOOL get_unixbuiltin_members(struct group *grp,
100                                 int *num_mem, LOCAL_GRP_MEMBER **members)
101 {
102         int i;
103         char *unix_name;
104
105         if (num_mem == NULL || members == NULL)
106         {
107                 return False;
108         }
109
110         (*num_mem) = 0;
111         (*members) = NULL;
112
113         for (i = 0; (unix_name = grp->gr_mem[i]) != NULL; i++)
114         {
115                 fstring name;
116                 DOM_NAME_MAP gmep;
117                 LOCAL_GRP_MEMBER *mem;
118
119                 fstrcpy(name, unix_name);
120
121                 if (!lookupsmbpwnam (name, &gmep) &&
122                     !lookupsmbgrpnam(name, &gmep))
123                 {
124                         continue;
125                 }
126
127                 if (!sid_front_equal(&global_sam_sid, &gmep.sid))
128                 {
129                         DEBUG(0,("builtin database: could not resolve name %s (wrong Domain SID)\n",
130                                   name));
131                         continue;
132                 }
133
134                 (*num_mem)++;
135                 (*members) = Realloc((*members), (*num_mem) * sizeof(LOCAL_GRP_MEMBER));
136                 if ((*members) == NULL)
137                 {
138                         DEBUG(0,("get_unixbuiltin_members: could not realloc LOCAL_GRP_MEMBERs\n"));
139                         return False;
140                 }
141
142                 mem = &(*members)[(*num_mem)-1];
143                 slprintf(mem->name, sizeof(mem->name)-1, "%s\\%s",
144                          gmep.nt_domain, gmep.nt_name);
145                 sid_copy(&mem->sid, &gmep.sid);
146                 mem->sid_use = gmep.type;
147
148                 DEBUG(10,("get_unixbuiltin_members: adding to builtin alias %s\n",
149                            mem->name));
150         }
151         return True;
152 }
153
154 /*************************************************************************
155  Routine to return the next entry in the domain builtin list.
156
157  when we are a PDC or BDC, then unix groups that are explicitly NOT mapped
158  to builtin aliases are treated as DOMAIN groups (see groupunix.c).
159
160  when we are a member of a domain (not a PDC or BDC) then unix groups
161  that are explicitly NOT mapped to builtin aliases are treated
162  as LOCAL groups.
163
164  the reasoning behind this is to make it as simple as possible (not an easy
165  task) for people to set up a domain-aware samba server, in each role that
166  the server can take.
167
168  *************************************************************************/
169 static LOCAL_GRP *getbltunixpwent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem)
170 {
171         /* Static buffers we will return. */
172         static LOCAL_GRP gp_buf;
173         struct group *unix_grp = NULL;
174         struct unix_entries *grps = (struct unix_entries *)vp;
175
176         if (grps == NULL)
177         {
178                 return NULL;
179         }
180
181         if (lp_server_role() == ROLE_DOMAIN_NONE)
182         {
183                 /*
184                  * no domain role, no domain aliases (or domain groups,
185                  * but that's dealt with by groupdb...).
186                  */
187
188                 return NULL;
189         }
190
191         bidb_init_blt(&gp_buf);
192
193         /* get array of unix names + gids.  this function does NOT
194            get a copy of the unix group members
195          */
196
197         /* cycle through unix groups */
198         for (; grps->grp_idx < grps->num_grps; grps->grp_idx++)
199         {
200                 DOM_NAME_MAP gmep;
201                 fstring sid_str;
202
203                 unix_grp = &grps->grps[grps->grp_idx];
204
205                 DEBUG(10,("getgrpunixpwent: enum unix group entry %s\n",
206                            unix_grp->gr_name));
207                         
208                 if (!lookupsmbgrpgid(unix_grp->gr_gid, &gmep))
209                 {
210                         continue;
211                 }
212
213                 sid_to_string(sid_str, &gmep.sid);
214                 DEBUG(10,("group %s found, sid %s type %d\n",
215                         gmep.nt_name, sid_str, gmep.type));
216
217                 if (gmep.type != SID_NAME_ALIAS)
218                 {
219                         continue;
220                 }
221
222                 sid_split_rid(&gmep.sid, &gp_buf.rid);
223                 if (!sid_equal(&global_sam_sid, &gmep.sid))
224                 {
225                         continue;
226                 }
227
228                 fstrcpy(gp_buf.name, gmep.nt_name);
229                 break;
230         }
231
232         if (unix_grp == NULL || grps->grp_idx >= grps->num_grps)
233         {
234                 return NULL;
235         }
236
237         /* get the user's domain aliases.  there are a maximum of 32 */
238
239         if (mem != NULL && num_mem != NULL)
240         {
241                 (*mem) = NULL;
242                 (*num_mem) = 0;
243
244                 unix_grp = getgrgid(unix_grp->gr_gid);
245                 get_unixbuiltin_members(unix_grp, num_mem, mem);
246         }
247
248         {
249                 pstring linebuf;
250                 make_alias_line(linebuf, sizeof(linebuf), &gp_buf, mem, num_mem);
251                 DEBUG(10,("line: '%s'\n", linebuf));
252         }
253
254         grps->grp_idx++; /* advance so next enum gets next entry */
255         return &gp_buf;
256 }
257
258 /************************************************************************
259  Routine to add an entry to the bltpasswd file.
260 *************************************************************************/
261
262 static BOOL add_bltunixgrp_entry(LOCAL_GRP *newblt)
263 {
264         DEBUG(0, ("add_bltunixgrp_entry: NOT IMPLEMENTED\n"));
265         return False;
266 }
267
268 /************************************************************************
269  Routine to search the bltpasswd file for an entry matching the builtinname.
270  and then modify its builtin entry. 
271 ************************************************************************/
272
273 static BOOL mod_bltunixgrp_entry(LOCAL_GRP* blt)
274 {
275         DEBUG(0, ("mod_bltunixgrp_entry: NOT IMPLEMENTED\n"));
276         return False;
277 }
278
279 /************************************************************************
280  Routine to add a member to an entry to the bltpasswd file.
281 *************************************************************************/
282 static BOOL add_bltunixgrp_member(uint32 rid, DOM_SID *member_sid)
283 {
284         DEBUG(0, ("add_bltunixgrp_member: NOT IMPLEMENTED\n"));
285         return False;
286 }
287
288 /************************************************************************
289  Routine to delete a member from an entry to the bltpasswd file.
290 *************************************************************************/
291 static BOOL del_bltunixgrp_member(uint32 rid, DOM_SID *member_sid)
292 {
293         DEBUG(0, ("del_bltunixgrp_member: NOT IMPLEMENTED\n"));
294         return False;
295 }
296
297 static struct aliasdb_ops unix_ops =
298 {
299         startbltunixpwent,
300         endbltunixpwent,
301         getbltunixpwpos,
302         setbltunixpwpos,
303
304         iterate_getbuiltinntnam,          /* In builtindb.c */
305         iterate_getbuiltingid,          /* In builtindb.c */
306         iterate_getbuiltinrid,          /* In builtindb.c */
307         getbltunixpwent,
308
309         add_bltunixgrp_entry,
310         mod_bltunixgrp_entry,
311         NULL, /* deliberately NULL: you can't delete builtin aliases */
312
313         add_bltunixgrp_member,
314         del_bltunixgrp_member,
315
316         iterate_getuserbuiltinntnam      /* in builtindb.c */
317 };
318
319 struct aliasdb_ops *unix_initialise_builtin_db(void)
320 {    
321         return &unix_ops;
322 }
323
324 #else
325  /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */
326  void unix_bltpass_dummy_function(void) { } /* stop some compilers complaining */
327 #endif /* USE_SMBPASS_DB */