Removed version number from file header.
[kai/samba.git] / source3 / groupdb / aliasfile.c
1 /*
2  * Unix SMB/CIFS implementation.
3  * SMB parameters and setup
4  * Copyright (C) Andrew Tridgell 1992-1998 Modified by Jeremy Allison 1995.
5  * 
6  * This program is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License as published by the Free
8  * Software Foundation; either version 2 of the License, or (at your option)
9  * any later version.
10  * 
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with
17  * this program; if not, write to the Free Software Foundation, Inc., 675
18  * Mass Ave, Cambridge, MA 02139, USA.
19  */
20
21 #include "includes.h"
22
23 #ifdef USE_SMBPASS_DB
24
25 static int al_file_lock_depth = 0;
26
27 static char s_readbuf[1024];
28
29 /***************************************************************
30  Start to enumerate the aliasdb list. Returns a void pointer
31  to ensure no modification outside this module.
32 ****************************************************************/
33
34 static void *startalsfilepwent(BOOL update)
35 {
36         return startfilepwent(lp_smb_alias_file(),
37                               s_readbuf, sizeof(s_readbuf),
38                               &al_file_lock_depth, update);
39 }
40
41 /***************************************************************
42  End enumeration of the aliasdb list.
43 ****************************************************************/
44
45 static void endalsfilepwent(void *vp)
46 {
47         endfilepwent(vp, &al_file_lock_depth);
48 }
49
50 /*************************************************************************
51  Return the current position in the aliasdb list as an SMB_BIG_UINT.
52  This must be treated as an opaque token.
53 *************************************************************************/
54 static SMB_BIG_UINT getalsfilepwpos(void *vp)
55 {
56         return getfilepwpos(vp);
57 }
58
59 /*************************************************************************
60  Set the current position in the aliasdb list from an SMB_BIG_UINT.
61  This must be treated as an opaque token.
62 *************************************************************************/
63 static BOOL setalsfilepwpos(void *vp, SMB_BIG_UINT tok)
64 {
65         return setfilepwpos(vp, tok);
66 }
67
68 static BOOL make_alias_line(char *p, int max_len,
69                                 LOCAL_GRP *als,
70                                 LOCAL_GRP_MEMBER **mem, int *num_mem)
71 {
72         int i;
73         int len;
74         len = slprintf(p, max_len-1, "%s:%s:%d:", als->name, als->comment, als->rid);
75
76         if (len == -1)
77         {
78                 DEBUG(0,("make_alias_line: cannot create entry\n"));
79                 return False;
80         }
81
82         p += len;
83         max_len -= len;
84
85         if (mem == NULL || num_mem == NULL)
86         {
87                 return True;
88         }
89
90         for (i = 0; i < (*num_mem); i++)
91         {
92                 len = strlen((*mem)[i].name);
93                 p = safe_strcpy(p, (*mem)[i].name, max_len); 
94
95                 if (p == NULL)
96                 {
97                         DEBUG(0, ("make_alias_line: out of space for aliases!\n"));
98                         return False;
99                 }
100
101                 max_len -= len;
102
103                 if (i != (*num_mem)-1)
104                 {
105                         *p = ',';
106                         p++;
107                         max_len--;
108                 }
109         }
110
111         return True;
112 }
113
114 /*************************************************************************
115  Routine to return the next entry in the smbdomainalias list.
116  *************************************************************************/
117 static char *get_alias_members(char *p, int *num_mem, LOCAL_GRP_MEMBER **members)
118 {
119         fstring name;
120
121         if (num_mem == NULL || members == NULL)
122                 return NULL;
123
124         (*num_mem) = 0;
125         (*members) = NULL;
126
127         while (next_token(&p, name, ",", sizeof(fstring))) {
128                 LOCAL_GRP_MEMBER *mbrs;
129                 DOM_SID sid;
130                 uint8 type;
131
132                 if (lookup_sid(name, &sid, &type)) {
133                         mbrs = Realloc((*members), ((*num_mem)+1) * sizeof(LOCAL_GRP_MEMBER));
134                         (*num_mem)++;
135                 } else {
136                         DEBUG(0,("alias database: could not resolve alias named %s\n", name));
137                         continue;
138                 }
139                 if (mbrs == NULL) {
140                         SAFE_FREE(*members);
141                         return NULL;
142         } else
143             (*members) = mbrs;
144                 
145                 fstrcpy((*members)[(*num_mem)-1].name, name);
146                 (*members)[(*num_mem)-1].sid_use = type;
147                 sid_copy(&(*members)[(*num_mem)-1].sid, &sid);
148         }
149         return p;
150 }
151
152 /*************************************************************************
153  Routine to return the next entry in the smbdomainalias list.
154  *************************************************************************/
155 static LOCAL_GRP *getalsfilepwent(void *vp, LOCAL_GRP_MEMBER **mem, int *num_mem)
156 {
157         /* Static buffers we will return. */
158         static LOCAL_GRP al_buf;
159
160         int gidval;
161
162         pstring linebuf;
163         char  *p;
164         size_t            linebuf_len;
165
166         aldb_init_als(&al_buf);
167
168         /*
169          * Scan the file, a line at a time and check if the name matches.
170          */
171         while ((linebuf_len = getfileline(vp, linebuf, sizeof(linebuf))) > 0)
172         {
173                 /* get alias name */
174
175                 p = strncpyn(al_buf.name, linebuf, sizeof(al_buf.name), ':');
176                 if (p == NULL)
177                 {
178                         DEBUG(0, ("getalsfilepwent: malformed alias entry (no :)\n"));
179                         continue;
180                 }
181
182                 /* Go past ':' */
183                 p++;
184
185                 /* get alias comment */
186
187                 p = strncpyn(al_buf.comment, p, sizeof(al_buf.comment), ':');
188                 if (p == NULL)
189                 {
190                         DEBUG(0, ("getalsfilepwent: malformed alias entry (no :)\n"));
191                         continue;
192                 }
193
194                 /* Go past ':' */
195                 p++;
196
197                 /* Get alias gid. */
198
199                 p = Atoic(p, &gidval, ":");
200
201                 if (p == NULL)
202                 {
203                         DEBUG(0, ("getalsfilepwent: malformed alias entry (no : after uid)\n"));
204                         continue;
205                 }
206
207                 /* Go past ':' */
208                 p++;
209
210                 /* now get the user's aliases.  there are a maximum of 32 */
211
212                 if (mem != NULL && num_mem != NULL)
213                 {
214                         (*mem) = NULL;
215                         (*num_mem) = 0;
216
217                         p = get_alias_members(p, num_mem, mem);
218                         if (p == NULL)
219                         {
220                                 DEBUG(0, ("getalsfilepwent: malformed alias entry (no : after members)\n"));
221                         }
222                 }
223
224                 /* ok, set up the static data structure and return it */
225
226                 al_buf.rid     = pwdb_gid_to_alias_rid((gid_t)gidval);
227
228                 make_alias_line(linebuf, sizeof(linebuf), &al_buf, mem, num_mem);
229                 DEBUG(10,("line: '%s'\n", linebuf));
230
231                 return &al_buf;
232         }
233
234         DEBUG(5,("getalsfilepwent: end of file reached.\n"));
235         return NULL;
236 }
237
238 /************************************************************************
239  Routine to add an entry to the aliasdb file.
240 *************************************************************************/
241
242 static BOOL add_alsfileals_entry(LOCAL_GRP *newals)
243 {
244         DEBUG(0, ("add_alsfileals_entry: NOT IMPLEMENTED\n"));
245         return False;
246 }
247
248 /************************************************************************
249  Routine to search the aliasdb file for an entry matching the aliasname.
250  and then modify its alias entry. We can't use the startalspwent()/
251  getalspwent()/endalspwent() interfaces here as we depend on looking
252  in the actual file to decide how much room we have to write data.
253  override = False, normal
254  override = True, override XXXXXXXX'd out alias or NO PASS
255 ************************************************************************/
256
257 static BOOL mod_alsfileals_entry(LOCAL_GRP* als)
258 {
259         DEBUG(0, ("mod_alsfileals_entry: NOT IMPLEMENTED\n"));
260         return False;
261 }
262
263
264 static struct aliasdb_ops file_ops =
265 {
266         startalsfilepwent,
267         endalsfilepwent,
268         getalsfilepwpos,
269         setalsfilepwpos,
270
271         iterate_getaliasnam,          /* In aliasdb.c */
272         iterate_getaliasgid,          /* In aliasdb.c */
273         iterate_getaliasrid,          /* In aliasdb.c */
274         getalsfilepwent,
275
276         add_alsfileals_entry,
277         mod_alsfileals_entry,
278
279         iterate_getuseraliasnam      /* in aliasdb.c */
280 };
281
282 struct aliasdb_ops *file_initialise_alias_db(void)
283 {    
284         return &file_ops;
285 }
286
287 #else
288  /* Do *NOT* make this function static. It breaks the compile on gcc. JRA */
289  void als_dummy_function(void) { } /* stop some compilers complaining */
290 #endif /* USE_SMBPASS_DB */