]> git.samba.org - samba.git/blob - source/utils/smbgroupedit.c
76624312d51c96682af1b14fb389afe4be329f2d
[samba.git] / source / utils / smbgroupedit.c
1 /* 
2  *  Unix SMB/Netbios implementation.
3  *  Version 1.9.
4  *  RPC Pipe client / server routines
5  *  Copyright (C) Andrew Tridgell              1992-2000,
6  *  Copyright (C) Jean François Micouleau      1998-2001.
7  *  
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *  
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *  
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22
23 #include "includes.h"
24
25 extern pstring global_myname;
26 extern int DEBUGLEVEL;
27 extern DOM_SID global_sam_sid;
28
29 /*
30  * Next two lines needed for SunOS and don't
31  * hurt anything else...
32  */
33 extern char *optarg;
34 extern int optind;
35
36 /*********************************************************
37  Print command usage on stderr and die.
38 **********************************************************/
39 static void usage(void)
40 {
41         if (getuid() == 0) {
42                 printf("groupedit options\n");
43         } else {
44                 printf("You need to be root to use this tool!\n");
45         }
46         printf("options:\n");
47         printf("  -a group             create new group\n");
48         printf("    -n group           NT group name\n");
49         printf("    -p privilege       only local\n");
50         printf("  -v                   list groups\n");
51         printf("  -c SID               change group\n");
52         printf("     -u unix group\n");
53         printf("  -x group             delete this group\n");
54         printf("\n");
55         printf("    -t[b|d|l]          type: builtin, domain, local \n");
56         exit(1);
57 }
58
59 /*********************************************************
60  add a group.
61 **********************************************************/
62 int addgroup(char *group, enum SID_NAME_USE sid_type, char *ntgroup, char *ntcomment, char *privilege)
63 {
64         uint32 se_priv;
65         gid_t gid;
66         DOM_SID sid;
67         fstring string_sid;
68         fstring name, comment;
69
70 /*      convert_priv_from_text(&se_priv, privilege);*/
71
72         se_priv=0x0;
73
74         gid=nametogid(group);
75         if (gid==-1)
76                 return -1;
77
78         local_gid_to_sid(&sid, gid);
79         sid_to_string(string_sid, &sid);
80
81         if (ntgroup==NULL)
82                 fstrcpy(name, group);
83         else
84                 fstrcpy(name, ntgroup);
85         
86         if (ntcomment==NULL)
87                 fstrcpy(comment, "Local Unix group");
88         else
89                 fstrcpy(comment, ntcomment);
90
91         if(!add_initial_entry(gid, string_sid, sid_type, name, comment, se_priv))
92                 return -1;
93
94         return 0;
95 }
96
97 /*********************************************************
98  Change a group.
99 **********************************************************/
100 int changegroup(char *sid_string, char *group, enum SID_NAME_USE sid_type, char *groupdesc, char *privilege)
101 {
102         DOM_SID sid;
103         GROUP_MAP map;
104         gid_t gid;
105         uint32 se_priv;
106
107         string_to_sid(&sid, sid_string);
108
109         /* Get the current mapping from the database */
110         if(!get_group_map_from_sid(sid, &map)) {
111                 printf("This SID does not exist in the database\n");
112                 return -1;
113         }
114
115         /* If a new Unix group is specified, check and change */
116         if (group!=NULL) {
117                 gid=nametogid(group);
118                 if (gid==-1) {
119                         printf("The UNIX group does not exist\n");
120                         return -1;
121                 } else
122                         map.gid=gid;
123         }
124         
125         /*
126          * Allow changing of group type only between domain and local
127          * We disallow changing Builtin groups !!! (SID problem)
128          */ 
129         if (sid_type==SID_NAME_ALIAS || sid_type==SID_NAME_DOM_GRP)
130                 if (map.sid_name_use==SID_NAME_ALIAS || map.sid_name_use==SID_NAME_DOM_GRP)
131                         map.sid_name_use=sid_type;
132
133
134         /* Change comment if new one */
135         if (groupdesc!=NULL)
136                 fstrcpy(map.comment, groupdesc);
137
138         /* Change the privilege if new one */
139         if (privilege!=NULL) {
140                 convert_priv_from_text(&se_priv, privilege);
141                 map.privilege=se_priv;
142         }
143
144         if (!add_mapping_entry(&map, TDB_REPLACE)) {
145                 printf("Count not update group database\n");
146                 return -1;
147         }
148
149         return 0;
150 }
151
152 /*********************************************************
153  Delete the group.
154 **********************************************************/
155 BOOL deletegroup(char *group)
156 {
157         DOM_SID sid;
158         
159         string_to_sid(&sid, group);
160
161         if(!group_map_remove(sid))
162                 return False;
163
164         return True;
165 }
166
167 /*********************************************************
168  List the groups.
169 **********************************************************/
170 int listgroup(enum SID_NAME_USE sid_type)
171 {
172         int entries,i;
173         GROUP_MAP *map=NULL;
174         fstring string_sid;
175         fstring group_type;
176         fstring priv_text;
177
178         printf("Unix\tSID\ttype\tnt name\tnt comment\tprivilege\n");
179                 
180         if (!enum_group_mapping(sid_type, &map, &entries, ENUM_ALL_MAPPED))
181                 return -1;
182         
183         for (i=0; i<entries; i++) {
184                 decode_sid_name_use(group_type, (map[i]).sid_name_use);
185                 sid_to_string(string_sid, &map[i].sid);
186                 convert_priv_to_text(map[i].privilege, priv_text);
187
188                 printf("%s\t%s\t%s\n\t%s\t%s\t%s\n\n", gidtoname(map[i].gid), map[i].nt_name, string_sid, 
189                                                      group_type, map[i].comment, priv_text);
190         }
191
192         return 0;
193 }
194
195 /*********************************************************
196  Start here.
197 **********************************************************/
198 int main (int argc, char **argv)
199 {
200         int ch;
201         static pstring servicesf = CONFIGFILE;
202         BOOL add_group = False;
203         BOOL view_group = False;
204         BOOL change_group = False;
205         BOOL delete_group = False;
206         BOOL nt_group = False;
207         BOOL priv = False;
208         BOOL group_type = False;
209         
210         char *group = NULL;
211         char *sid = NULL;
212         char *ntgroup = NULL;
213         char *privilege = NULL;
214         char *groupt = NULL;
215         char *group_desc = NULL;
216
217         enum SID_NAME_USE sid_type;
218
219         TimeInit();
220         
221         setup_logging("groupedit", True);
222
223         charset_initialise();
224
225         if (argc < 2) {
226                 usage();
227                 return 0;
228         }
229         
230         if(!initialize_password_db(True)) {
231                 fprintf(stderr, "Can't setup password database vectors.\n");
232                 exit(1);
233         }
234         
235         if (!lp_load(servicesf,True,False,False)) {
236                 fprintf(stderr, "Can't load %s - run testparm to debug it\n", 
237                         servicesf);
238                 exit(1);
239         }
240         
241         while ((ch = getopt(argc, argv, "a:c:d:n:p:t:u:vx:")) != EOF) {
242                 switch(ch) {
243                 case 'a':
244                         add_group = True;
245                         group=optarg;
246                         break;
247                 case 'c':
248                         change_group = True;
249                         sid=optarg;
250                         break;
251                 case 'd':
252                         group_desc=optarg;
253                         break;
254                 case 'n':
255                         nt_group = True;
256                         ntgroup=optarg;
257                         break;
258                 case 'p':
259                         priv = True;
260                         privilege=optarg;
261                         break;
262                 case 't':
263                         group_type = True;
264                         groupt=optarg;
265                         break;
266                 case 'u':
267                         group=optarg;
268                         break;
269                 case 'v':
270                         view_group = True;
271                         break;
272                 case 'x':
273                         delete_group = True;
274                         group=optarg;
275                         break;
276                 /*default:
277                         usage();*/
278                 }
279         }
280         
281         
282         if (((add_group?1:0) + (view_group?1:0) + (change_group?1:0) + (delete_group?1:0)) > 1) {
283                 fprintf (stderr, "Incompatible options on command line!\n");
284                 usage();
285                 exit(1);
286         }
287
288         /* no option on command line -> list groups */  
289         if (((add_group?1:0) + (view_group?1:0) + (change_group?1:0) + (delete_group?1:0)) == 0)
290                 view_group = True;
291
292         
293         if (group_type==False)
294                 sid_type=SID_NAME_UNKNOWN;
295         else {
296                 switch (groupt[0]) {
297                         case 'l':
298                         case 'L':
299                                 sid_type=SID_NAME_ALIAS;
300                                 break;
301                         case 'd':
302                         case 'D':
303                                 sid_type=SID_NAME_DOM_GRP;
304                                 break;
305                         case 'b':
306                         case 'B':
307                                 sid_type=SID_NAME_WKN_GRP;
308                                 break;
309                         default:
310                                 sid_type=SID_NAME_UNKNOWN;
311                                 break;
312                 }
313         }
314                 
315         if (init_group_mapping()==False) {
316                 printf("Could not open tdb mapping file.\n");
317                 return 0;
318         }
319         
320         if(pdb_generate_sam_sid()==False) {
321                 printf("Can not read machine SID\n");
322                 return 0;
323         }
324
325         default_group_mapping();
326
327         if (add_group)
328                 return addgroup(group, sid_type, ntgroup, group_desc, privilege);
329
330         if (view_group)
331                 return listgroup(sid_type);
332
333         if (delete_group)
334                 return deletegroup(group);
335         
336         if (change_group) {             
337                 return changegroup(sid, group, sid_type, group_desc, privilege);
338         }
339         
340         usage();
341
342         return 0;
343 }
344
345