s3-libsmb: Fix scanf format in parse_ace().
[sfrench/samba-autobuild/.git] / source3 / utils / net_sam.c
1 /*
2  *  Unix SMB/CIFS implementation.
3  *  Local SAM access routines
4  *  Copyright (C) Volker Lendecke 2006
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "includes.h"
22 #include "system/passwd.h"
23 #include "utils/net.h"
24 #include "../librpc/gen_ndr/samr.h"
25 #include "smbldap.h"
26 #include "../libcli/security/security.h"
27 #include "lib/winbind_util.h"
28 #include "passdb.h"
29 #include "passdb/pdb_ldap_util.h"
30 #include "passdb/pdb_ldap_schema.h"
31 #include "lib/privileges.h"
32 #include "secrets.h"
33
34 /*
35  * Set a user's data
36  */
37
38 static int net_sam_userset(struct net_context *c, int argc, const char **argv,
39                            const char *field,
40                            bool (*fn)(struct samu *, const char *,
41                                       enum pdb_value_state))
42 {
43         struct samu *sam_acct = NULL;
44         struct dom_sid sid;
45         enum lsa_SidType type;
46         const char *dom, *name;
47         NTSTATUS status;
48
49         if (argc != 2 || c->display_usage) {
50                 d_fprintf(stderr, "%s\n", _("Usage:"));
51                 d_fprintf(stderr, _("net sam set %s <user> <value>\n"),
52                           field);
53                 return -1;
54         }
55
56         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
57                          &dom, &name, &sid, &type)) {
58                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
59                 return -1;
60         }
61
62         if (type != SID_NAME_USER) {
63                 d_fprintf(stderr, _("%s is a %s, not a user\n"), argv[0],
64                           sid_type_lookup(type));
65                 return -1;
66         }
67
68         if ( !(sam_acct = samu_new( NULL )) ) {
69                 d_fprintf(stderr, _("Internal error\n"));
70                 return -1;
71         }
72
73         if (!pdb_getsampwsid(sam_acct, &sid)) {
74                 d_fprintf(stderr, _("Loading user %s failed\n"), argv[0]);
75                 return -1;
76         }
77
78         if (!fn(sam_acct, argv[1], PDB_CHANGED)) {
79                 d_fprintf(stderr, _("Internal error\n"));
80                 return -1;
81         }
82
83         status = pdb_update_sam_account(sam_acct);
84         if (!NT_STATUS_IS_OK(status)) {
85                 d_fprintf(stderr, _("Updating sam account %s failed with %s\n"),
86                           argv[0], nt_errstr(status));
87                 return -1;
88         }
89
90         TALLOC_FREE(sam_acct);
91
92         d_printf(_("Updated %s for %s\\%s to %s\n"), field, dom, name, argv[1]);
93         return 0;
94 }
95
96 static int net_sam_set_fullname(struct net_context *c, int argc,
97                                 const char **argv)
98 {
99         return net_sam_userset(c, argc, argv, "fullname",
100                                pdb_set_fullname);
101 }
102
103 static int net_sam_set_logonscript(struct net_context *c, int argc,
104                                    const char **argv)
105 {
106         return net_sam_userset(c, argc, argv, "logonscript",
107                                pdb_set_logon_script);
108 }
109
110 static int net_sam_set_profilepath(struct net_context *c, int argc,
111                                    const char **argv)
112 {
113         return net_sam_userset(c, argc, argv, "profilepath",
114                                pdb_set_profile_path);
115 }
116
117 static int net_sam_set_homedrive(struct net_context *c, int argc,
118                                  const char **argv)
119 {
120         return net_sam_userset(c, argc, argv, "homedrive",
121                                pdb_set_dir_drive);
122 }
123
124 static int net_sam_set_homedir(struct net_context *c, int argc,
125                                const char **argv)
126 {
127         return net_sam_userset(c, argc, argv, "homedir",
128                                pdb_set_homedir);
129 }
130
131 static int net_sam_set_workstations(struct net_context *c, int argc,
132                                     const char **argv)
133 {
134         return net_sam_userset(c, argc, argv, "workstations",
135                                pdb_set_workstations);
136 }
137
138 /*
139  * Set account flags
140  */
141
142 static int net_sam_set_userflag(struct net_context *c, int argc,
143                                 const char **argv, const char *field,
144                                 uint16 flag)
145 {
146         struct samu *sam_acct = NULL;
147         struct dom_sid sid;
148         enum lsa_SidType type;
149         const char *dom, *name;
150         NTSTATUS status;
151         uint32_t acct_flags;
152
153         if ((argc != 2) || c->display_usage ||
154             (!strequal(argv[1], "yes") &&
155              !strequal(argv[1], "no"))) {
156                 d_fprintf(stderr, "%s\n", _("Usage:"));
157                 d_fprintf(stderr, _("net sam set %s <user> [yes|no]\n"),
158                           field);
159                 return -1;
160         }
161
162         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
163                          &dom, &name, &sid, &type)) {
164                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
165                 return -1;
166         }
167
168         if (type != SID_NAME_USER) {
169                 d_fprintf(stderr, _("%s is a %s, not a user\n"), argv[0],
170                           sid_type_lookup(type));
171                 return -1;
172         }
173
174         if ( !(sam_acct = samu_new( NULL )) ) {
175                 d_fprintf(stderr, _("Internal error\n"));
176                 return -1;
177         }
178
179         if (!pdb_getsampwsid(sam_acct, &sid)) {
180                 d_fprintf(stderr, _("Loading user %s failed\n"), argv[0]);
181                 return -1;
182         }
183
184         acct_flags = pdb_get_acct_ctrl(sam_acct);
185
186         if (strequal(argv[1], "yes")) {
187                 acct_flags |= flag;
188         } else {
189                 acct_flags &= ~flag;
190         }
191
192         pdb_set_acct_ctrl(sam_acct, acct_flags, PDB_CHANGED);
193
194         status = pdb_update_sam_account(sam_acct);
195         if (!NT_STATUS_IS_OK(status)) {
196                 d_fprintf(stderr, _("Updating sam account %s failed with %s\n"),
197                           argv[0], nt_errstr(status));
198                 return -1;
199         }
200
201         TALLOC_FREE(sam_acct);
202
203         d_fprintf(stderr, _("Updated flag %s for %s\\%s to %s\n"), field, dom,
204                   name, argv[1]);
205         return 0;
206 }
207
208 static int net_sam_set_disabled(struct net_context *c, int argc,
209                                 const char **argv)
210 {
211         return net_sam_set_userflag(c, argc, argv, "disabled", ACB_DISABLED);
212 }
213
214 static int net_sam_set_pwnotreq(struct net_context *c, int argc,
215                                 const char **argv)
216 {
217         return net_sam_set_userflag(c, argc, argv, "pwnotreq", ACB_PWNOTREQ);
218 }
219
220 static int net_sam_set_autolock(struct net_context *c, int argc,
221                                 const char **argv)
222 {
223         return net_sam_set_userflag(c, argc, argv, "autolock", ACB_AUTOLOCK);
224 }
225
226 static int net_sam_set_pwnoexp(struct net_context *c, int argc,
227                                const char **argv)
228 {
229         return net_sam_set_userflag(c, argc, argv, "pwnoexp", ACB_PWNOEXP);
230 }
231
232 /*
233  * Set pass last change time, based on force pass change now
234  */
235
236 static int net_sam_set_pwdmustchangenow(struct net_context *c, int argc,
237                                         const char **argv)
238 {
239         struct samu *sam_acct = NULL;
240         struct dom_sid sid;
241         enum lsa_SidType type;
242         const char *dom, *name;
243         NTSTATUS status;
244
245         if ((argc != 2) || c->display_usage ||
246             (!strequal(argv[1], "yes") &&
247              !strequal(argv[1], "no"))) {
248                 d_fprintf(stderr, "%s\n%s",
249                           _("Usage:"),
250                           _("net sam set pwdmustchangenow <user> [yes|no]\n"));
251                 return -1;
252         }
253
254         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
255                          &dom, &name, &sid, &type)) {
256                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
257                 return -1;
258         }
259
260         if (type != SID_NAME_USER) {
261                 d_fprintf(stderr, _("%s is a %s, not a user\n"), argv[0],
262                           sid_type_lookup(type));
263                 return -1;
264         }
265
266         if ( !(sam_acct = samu_new( NULL )) ) {
267                 d_fprintf(stderr, _("Internal error\n"));
268                 return -1;
269         }
270
271         if (!pdb_getsampwsid(sam_acct, &sid)) {
272                 d_fprintf(stderr, _("Loading user %s failed\n"), argv[0]);
273                 return -1;
274         }
275
276         if (strequal(argv[1], "yes")) {
277                 pdb_set_pass_last_set_time(sam_acct, 0, PDB_CHANGED);
278         } else {
279                 pdb_set_pass_last_set_time(sam_acct, time(NULL), PDB_CHANGED);
280         }
281
282         status = pdb_update_sam_account(sam_acct);
283         if (!NT_STATUS_IS_OK(status)) {
284                 d_fprintf(stderr, _("Updating sam account %s failed with %s\n"),
285                           argv[0], nt_errstr(status));
286                 return -1;
287         }
288
289         TALLOC_FREE(sam_acct);
290
291         d_fprintf(stderr, _("Updated 'user must change password at next logon' "
292                             "for %s\\%s to %s\n"), dom,
293                   name, argv[1]);
294         return 0;
295 }
296
297
298 /*
299  * Set a user's or a group's comment
300  */
301
302 static int net_sam_set_comment(struct net_context *c, int argc,
303                                const char **argv)
304 {
305         GROUP_MAP *map;
306         struct dom_sid sid;
307         enum lsa_SidType type;
308         const char *dom, *name;
309         NTSTATUS status;
310
311         if (argc != 2 || c->display_usage) {
312                 d_fprintf(stderr, "%s\n%s",
313                           _("Usage:"),
314                           _("net sam set comment <name> <comment>\n"));
315                 return -1;
316         }
317
318         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
319                          &dom, &name, &sid, &type)) {
320                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
321                 return -1;
322         }
323
324         if (type == SID_NAME_USER) {
325                 return net_sam_userset(c, argc, argv, "comment",
326                                        pdb_set_acct_desc);
327         }
328
329         if ((type != SID_NAME_DOM_GRP) && (type != SID_NAME_ALIAS) &&
330             (type != SID_NAME_WKN_GRP)) {
331                 d_fprintf(stderr, _("%s is a %s, not a group\n"), argv[0],
332                           sid_type_lookup(type));
333                 return -1;
334         }
335
336         map = talloc_zero(talloc_tos(), GROUP_MAP);
337         if (!map) {
338                 d_fprintf(stderr, _("Out of memory!\n"));
339                 return -1;
340         }
341
342         if (!pdb_getgrsid(map, sid)) {
343                 d_fprintf(stderr, _("Could not load group %s\n"), argv[0]);
344                 return -1;
345         }
346
347         map->comment = talloc_strdup(map, argv[1]);
348         if (!map->comment) {
349                 d_fprintf(stderr, _("Out of memory!\n"));
350                 return -1;
351         }
352
353         status = pdb_update_group_mapping_entry(map);
354
355         if (!NT_STATUS_IS_OK(status)) {
356                 d_fprintf(stderr, _("Updating group mapping entry failed with "
357                           "%s\n"), nt_errstr(status));
358                 return -1;
359         }
360
361         d_printf("Updated comment of group %s\\%s to %s\n", dom, name,
362                  argv[1]);
363
364         TALLOC_FREE(map);
365         return 0;
366 }
367
368 static int net_sam_set(struct net_context *c, int argc, const char **argv)
369 {
370         struct functable func[] = {
371                 {
372                         "homedir",
373                         net_sam_set_homedir,
374                         NET_TRANSPORT_LOCAL,
375                         N_("Change a user's home directory"),
376                         N_("net sam set homedir\n"
377                            "    Change a user's home directory")
378                 },
379                 {
380                         "profilepath",
381                         net_sam_set_profilepath,
382                         NET_TRANSPORT_LOCAL,
383                         N_("Change a user's profile path"),
384                         N_("net sam set profilepath\n"
385                            "    Change a user's profile path")
386                 },
387                 {
388                         "comment",
389                         net_sam_set_comment,
390                         NET_TRANSPORT_LOCAL,
391                         N_("Change a users or groups description"),
392                         N_("net sam set comment\n"
393                            "    Change a users or groups description")
394                 },
395                 {
396                         "fullname",
397                         net_sam_set_fullname,
398                         NET_TRANSPORT_LOCAL,
399                         N_("Change a user's full name"),
400                         N_("net sam set fullname\n"
401                            "    Change a user's full name")
402                 },
403                 {
404                         "logonscript",
405                         net_sam_set_logonscript,
406                         NET_TRANSPORT_LOCAL,
407                         N_("Change a user's logon script"),
408                         N_("net sam set logonscript\n"
409                            "    Change a user's logon script")
410                 },
411                 {
412                         "homedrive",
413                         net_sam_set_homedrive,
414                         NET_TRANSPORT_LOCAL,
415                         N_("Change a user's home drive"),
416                         N_("net sam set homedrive\n"
417                            "    Change a user's home drive")
418                 },
419                 {
420                         "workstations",
421                         net_sam_set_workstations,
422                         NET_TRANSPORT_LOCAL,
423                         N_("Change a user's allowed workstations"),
424                         N_("net sam set workstations\n"
425                            "    Change a user's allowed workstations")
426                 },
427                 {
428                         "disabled",
429                         net_sam_set_disabled,
430                         NET_TRANSPORT_LOCAL,
431                         N_("Disable/Enable a user"),
432                         N_("net sam set disable\n"
433                            "    Disable/Enable a user")
434                 },
435                 {
436                         "pwnotreq",
437                         net_sam_set_pwnotreq,
438                         NET_TRANSPORT_LOCAL,
439                         N_("Disable/Enable the password not required flag"),
440                         N_("net sam set pwnotreq\n"
441                            "    Disable/Enable the password not required flag")
442                 },
443                 {
444                         "autolock",
445                         net_sam_set_autolock,
446                         NET_TRANSPORT_LOCAL,
447                         N_("Disable/Enable a user's lockout flag"),
448                         N_("net sam set autolock\n"
449                            "    Disable/Enable a user's lockout flag")
450                 },
451                 {
452                         "pwnoexp",
453                         net_sam_set_pwnoexp,
454                         NET_TRANSPORT_LOCAL,
455                         N_("Disable/Enable whether a user's pw does not "
456                            "expire"),
457                         N_("net sam set pwnoexp\n"
458                            "    Disable/Enable whether a user's pw does not "
459                            "expire")
460                 },
461                 {
462                         "pwdmustchangenow",
463                         net_sam_set_pwdmustchangenow,
464                         NET_TRANSPORT_LOCAL,
465                         N_("Force users password must change at next logon"),
466                         N_("net sam set pwdmustchangenow\n"
467                            "    Force users password must change at next logon")
468                 },
469                 {NULL, NULL, 0, NULL, NULL}
470         };
471
472         return net_run_function(c, argc, argv, "net sam set", func);
473 }
474
475 /*
476  * Manage account policies
477  */
478
479 static int net_sam_policy_set(struct net_context *c, int argc, const char **argv)
480 {
481         const char *account_policy = NULL;
482         uint32 value = 0;
483         uint32 old_value = 0;
484         enum pdb_policy_type field;
485         char *endptr;
486
487         if (argc != 2 || c->display_usage) {
488                 d_fprintf(stderr, "%s\n%s",
489                           _("Usage:"),
490                           _("net sam policy set \"<account policy>\" <value>\n"));
491                 return -1;
492         }
493
494         account_policy = argv[0];
495         field = account_policy_name_to_typenum(account_policy);
496
497         if (strequal(argv[1], "forever") || strequal(argv[1], "never")
498             || strequal(argv[1], "off")) {
499                 value = -1;
500         }
501         else {
502                 value = strtoul(argv[1], &endptr, 10);
503
504                 if ((endptr == argv[1]) || (endptr[0] != '\0')) {
505                         d_printf(_("Unable to set policy \"%s\"! Invalid value "
506                                  "\"%s\".\n"),
507                                  account_policy, argv[1]);
508                         return -1;
509                 }
510         }
511
512         if (field == 0) {
513                 const char **names;
514                 int i, count;
515
516                 account_policy_names_list(talloc_tos(), &names, &count);
517                 d_fprintf(stderr, _("No account policy \"%s\"!\n\n"), argv[0]);
518                 d_fprintf(stderr, _("Valid account policies are:\n"));
519
520                 for (i=0; i<count; i++) {
521                         d_fprintf(stderr, "%s\n", names[i]);
522                 }
523
524                 TALLOC_FREE(names);
525
526                 return -1;
527         }
528
529         if (!pdb_get_account_policy(field, &old_value)) {
530                 d_fprintf(stderr, _("Valid account policy, but unable to fetch "
531                           "value!\n"));
532         } else {
533                 d_printf(_("Account policy \"%s\" value was: %d\n"),
534                         account_policy, old_value);
535         }
536
537         if (!pdb_set_account_policy(field, value)) {
538                 d_fprintf(stderr, _("Valid account policy, but unable to "
539                           "set value!\n"));
540                 return -1;
541         } else {
542                 d_printf(_("Account policy \"%s\" value is now: %d\n"),
543                         account_policy, value);
544         }
545
546         return 0;
547 }
548
549 static int net_sam_policy_show(struct net_context *c, int argc, const char **argv)
550 {
551         const char *account_policy = NULL;
552         uint32 old_value;
553         enum pdb_policy_type field;
554
555         if (argc != 1 || c->display_usage) {
556                 d_fprintf(stderr, "%s\n%s",
557                           _("Usage:"),
558                           _("net sam policy show \"<account policy>\"\n"));
559                 return -1;
560         }
561
562         account_policy = argv[0];
563         field = account_policy_name_to_typenum(account_policy);
564
565         if (field == 0) {
566                 const char **names;
567                 int count;
568                 int i;
569                 account_policy_names_list(talloc_tos(), &names, &count);
570                 d_fprintf(stderr, _("No account policy by that name!\n"));
571                 if (count != 0) {
572                         d_fprintf(stderr, _("Valid account policies "
573                                   "are:\n"));
574                         for (i=0; i<count; i++) {
575                                 d_fprintf(stderr, "%s\n", names[i]);
576                         }
577                 }
578                 TALLOC_FREE(names);
579                 return -1;
580         }
581
582         if (!pdb_get_account_policy(field, &old_value)) {
583                 fprintf(stderr, _("Valid account policy, but unable to "
584                         "fetch value!\n"));
585                 return -1;
586         }
587
588         printf(_("Account policy \"%s\" description: %s\n"),
589                account_policy, account_policy_get_desc(field));
590         printf(_("Account policy \"%s\" value is: %d\n"), account_policy,
591                old_value);
592         return 0;
593 }
594
595 static int net_sam_policy_list(struct net_context *c, int argc, const char **argv)
596 {
597         const char **names;
598         int count;
599         int i;
600
601         if (c->display_usage) {
602                 d_printf(  "%s\n"
603                            "net sam policy list\n"
604                            "    %s\n",
605                          _("Usage:"),
606                          _("List account policies"));
607                 return 0;
608         }
609
610         account_policy_names_list(talloc_tos(), &names, &count);
611         if (count != 0) {
612                 d_fprintf(stderr, _("Valid account policies "
613                           "are:\n"));
614                 for (i = 0; i < count ; i++) {
615                         d_fprintf(stderr, "%s\n", names[i]);
616                 }
617         }
618         TALLOC_FREE(names);
619         return -1;
620 }
621
622 static int net_sam_policy(struct net_context *c, int argc, const char **argv)
623 {
624         struct functable func[] = {
625                 {
626                         "list",
627                         net_sam_policy_list,
628                         NET_TRANSPORT_LOCAL,
629                         N_("List account policies"),
630                         N_("net sam policy list\n"
631                            "    List account policies")
632                 },
633                 {
634                         "show",
635                         net_sam_policy_show,
636                         NET_TRANSPORT_LOCAL,
637                         N_("Show account policies"),
638                         N_("net sam policy show\n"
639                            "    Show account policies")
640                 },
641                 {
642                         "set",
643                         net_sam_policy_set,
644                         NET_TRANSPORT_LOCAL,
645                         N_("Change account policies"),
646                         N_("net sam policy set\n"
647                            "    Change account policies")
648                 },
649                 {NULL, NULL, 0, NULL, NULL}
650         };
651
652         return net_run_function(c, argc, argv, "net sam policy", func);
653 }
654
655 static int net_sam_rights_list(struct net_context *c, int argc,
656                                const char **argv)
657 {
658         enum sec_privilege privilege;
659
660         if (argc > 1 || c->display_usage) {
661                 d_fprintf(stderr, "%s\n%s",
662                           _("Usage:"),
663                           _("net sam rights list [privilege name]\n"));
664                 return -1;
665         }
666
667         if (argc == 0) {
668                 int i;
669                 int num = num_privileges_in_short_list();
670
671                 for (i=0; i<num; i++) {
672                         d_printf("%s\n", sec_privilege_name_from_index(i));
673                 }
674                 return 0;
675         }
676
677         privilege = sec_privilege_id(argv[0]);
678
679         if (privilege != SEC_PRIV_INVALID) {
680                 struct dom_sid *sids;
681                 int i, num_sids;
682                 NTSTATUS status;
683
684                 status = privilege_enum_sids(privilege, talloc_tos(),
685                                              &sids, &num_sids);
686                 if (!NT_STATUS_IS_OK(status)) {
687                         d_fprintf(stderr, _("Could not list rights: %s\n"),
688                                   nt_errstr(status));
689                         return -1;
690                 }
691
692                 for (i=0; i<num_sids; i++) {
693                         const char *dom, *name;
694                         enum lsa_SidType type;
695
696                         if (lookup_sid(talloc_tos(), &sids[i], &dom, &name,
697                                        &type)) {
698                                 d_printf("%s\\%s\n", dom, name);
699                         }
700                         else {
701                                 d_printf("%s\n", sid_string_tos(&sids[i]));
702                         }
703                 }
704                 return 0;
705         }
706
707         return -1;
708 }
709
710 static int net_sam_rights_grant(struct net_context *c, int argc,
711                                 const char **argv)
712 {
713         struct dom_sid sid;
714         enum lsa_SidType type;
715         const char *dom, *name;
716         int i;
717
718         if (argc < 2 || c->display_usage) {
719                 d_fprintf(stderr, "%s\n%s",
720                           _("Usage:"),
721                           _("net sam rights grant <name> <rights> ...\n"));
722                 return -1;
723         }
724
725         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
726                         &dom, &name, &sid, &type)) {
727                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
728                 return -1;
729         }
730
731         for (i=1; i < argc; i++) {
732                 enum sec_privilege privilege = sec_privilege_id(argv[i]);
733                 if (privilege == SEC_PRIV_INVALID) {
734                         d_fprintf(stderr, _("%s unknown\n"), argv[i]);
735                         return -1;
736                 }
737
738                 if (!grant_privilege_by_name(&sid, argv[i])) {
739                         d_fprintf(stderr, _("Could not grant privilege\n"));
740                         return -1;
741                 }
742
743                 d_printf(_("Granted %s to %s\\%s\n"), argv[i], dom, name);
744         }
745
746         return 0;
747 }
748
749 static int net_sam_rights_revoke(struct net_context *c, int argc,
750                                 const char **argv)
751 {
752         struct dom_sid sid;
753         enum lsa_SidType type;
754         const char *dom, *name;
755         int i;
756
757         if (argc < 2 || c->display_usage) {
758                 d_fprintf(stderr, "%s\n%s",
759                           _("Usage:"),
760                           _("net sam rights revoke <name> <rights>\n"));
761                 return -1;
762         }
763
764         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
765                         &dom, &name, &sid, &type)) {
766                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
767                 return -1;
768         }
769
770         for (i=1; i < argc; i++) {
771                 enum sec_privilege privilege = sec_privilege_id(argv[i]);
772                 if (privilege == SEC_PRIV_INVALID) {
773                         d_fprintf(stderr, _("%s unknown\n"), argv[i]);
774                         return -1;
775                 }
776
777                 if (!revoke_privilege_by_name(&sid, argv[i])) {
778                         d_fprintf(stderr, _("Could not revoke privilege\n"));
779                         return -1;
780                 }
781
782                 d_printf(_("Revoked %s from %s\\%s\n"), argv[i], dom, name);
783         }
784
785         return 0;
786 }
787
788 static int net_sam_rights(struct net_context *c, int argc, const char **argv)
789 {
790         struct functable func[] = {
791                 {
792                         "list",
793                         net_sam_rights_list,
794                         NET_TRANSPORT_LOCAL,
795                         N_("List possible user rights"),
796                         N_("net sam rights list\n"
797                            "    List possible user rights")
798                 },
799                 {
800                         "grant",
801                         net_sam_rights_grant,
802                         NET_TRANSPORT_LOCAL,
803                         N_("Grant right(s)"),
804                         N_("net sam rights grant\n"
805                            "    Grant right(s)")
806                 },
807                 {
808                         "revoke",
809                         net_sam_rights_revoke,
810                         NET_TRANSPORT_LOCAL,
811                         N_("Revoke right(s)"),
812                         N_("net sam rights revoke\n"
813                            "    Revoke right(s)")
814                 },
815                 {NULL, NULL, 0, NULL, NULL}
816         };
817         return net_run_function(c, argc, argv, "net sam rights", func);
818 }
819
820 /*
821  * Map a unix group to a domain group
822  */
823
824 static NTSTATUS map_unix_group(const struct group *grp, GROUP_MAP *map)
825 {
826         const char *dom, *name;
827         uint32 rid;
828
829         if (pdb_getgrgid(map, grp->gr_gid)) {
830                 return NT_STATUS_GROUP_EXISTS;
831         }
832
833         map->gid = grp->gr_gid;
834
835         if (lookup_name(talloc_tos(), grp->gr_name, LOOKUP_NAME_LOCAL,
836                         &dom, &name, NULL, NULL)) {
837
838                 map->nt_name = talloc_asprintf(map, "Unix Group %s",
839                                                         grp->gr_name);
840
841                 DEBUG(5, ("%s exists as %s\\%s, retrying as \"%s\"\n",
842                           grp->gr_name, dom, name, map->nt_name));
843         }
844
845         if (lookup_name(talloc_tos(), grp->gr_name, LOOKUP_NAME_LOCAL,
846                         NULL, NULL, NULL, NULL)) {
847                 DEBUG(3, ("\"%s\" exists, can't map it\n", grp->gr_name));
848                 return NT_STATUS_GROUP_EXISTS;
849         }
850
851         if (pdb_capabilities() & PDB_CAP_STORE_RIDS) {
852                 if (!pdb_new_rid(&rid)) {
853                         DEBUG(3, ("Could not get a new RID for %s\n",
854                                   grp->gr_name));
855                         return NT_STATUS_ACCESS_DENIED;
856                 }
857         } else {
858                 rid = algorithmic_pdb_gid_to_group_rid( grp->gr_gid );
859         }
860
861         sid_compose(&map->sid, get_global_sam_sid(), rid);
862         map->sid_name_use = SID_NAME_DOM_GRP;
863         map->comment = talloc_asprintf(map, "Unix Group %s", grp->gr_name);
864
865         return pdb_add_group_mapping_entry(map);
866 }
867
868 static int net_sam_mapunixgroup(struct net_context *c, int argc, const char **argv)
869 {
870         NTSTATUS status;
871         GROUP_MAP *map;
872         struct group *grp;
873
874         if (argc != 1 || c->display_usage) {
875                 d_fprintf(stderr, "%s\n%s",
876                           _("Usage:"),
877                           _("net sam mapunixgroup <name>\n"));
878                 return -1;
879         }
880
881         grp = getgrnam(argv[0]);
882         if (grp == NULL) {
883                 d_fprintf(stderr, _("Could not find group %s\n"), argv[0]);
884                 return -1;
885         }
886
887         map = talloc_zero(talloc_tos(), GROUP_MAP);
888         if (!map) {
889                 d_fprintf(stderr, _("Out of memory!\n"));
890                 return -1;
891         }
892
893         status = map_unix_group(grp, map);
894
895         if (!NT_STATUS_IS_OK(status)) {
896                 d_fprintf(stderr, _("Mapping group %s failed with %s\n"),
897                           argv[0], nt_errstr(status));
898                 return -1;
899         }
900
901         d_printf(_("Mapped unix group %s to SID %s\n"), argv[0],
902                  sid_string_tos(&map->sid));
903
904         TALLOC_FREE(map);
905         return 0;
906 }
907
908 /*
909  * Remove a group mapping
910  */
911
912 static NTSTATUS unmap_unix_group(const struct group *grp)
913 {
914         struct dom_sid dom_sid;
915
916         if (!lookup_name(talloc_tos(), grp->gr_name, LOOKUP_NAME_LOCAL,
917                         NULL, NULL, NULL, NULL)) {
918                 DEBUG(3, ("\"%s\" does not exist, can't unmap it\n", grp->gr_name));
919                 return NT_STATUS_NO_SUCH_GROUP;
920         }
921
922         if (!pdb_gid_to_sid(grp->gr_gid, &dom_sid)) {
923                 return NT_STATUS_UNSUCCESSFUL;
924         }
925
926         return pdb_delete_group_mapping_entry(dom_sid);
927 }
928
929 static int net_sam_unmapunixgroup(struct net_context *c, int argc, const char **argv)
930 {
931         NTSTATUS status;
932         struct group *grp;
933
934         if (argc != 1 || c->display_usage) {
935                 d_fprintf(stderr, "%s\n%s",
936                           _("Usage:"),
937                           _("net sam unmapunixgroup <name>\n"));
938                 return -1;
939         }
940
941         grp = getgrnam(argv[0]);
942         if (grp == NULL) {
943                 d_fprintf(stderr, _("Could not find mapping for group %s.\n"),
944                           argv[0]);
945                 return -1;
946         }
947
948         status = unmap_unix_group(grp);
949
950         if (!NT_STATUS_IS_OK(status)) {
951                 d_fprintf(stderr, _("Unmapping group %s failed with %s.\n"),
952                           argv[0], nt_errstr(status));
953                 return -1;
954         }
955
956         d_printf(_("Unmapped unix group %s.\n"), argv[0]);
957
958         return 0;
959 }
960
961 /*
962  * Create a domain group
963  */
964
965 static int net_sam_createdomaingroup(struct net_context *c, int argc,
966                                      const char **argv)
967 {
968         NTSTATUS status;
969         uint32 rid;
970
971         if (argc != 1 || c->display_usage) {
972                 d_fprintf(stderr, "%s\n%s",
973                           _("Usage:"),
974                           _("net sam createdomaingroup <name>\n"));
975                 return -1;
976         }
977
978         status = pdb_create_dom_group(talloc_tos(), argv[0], &rid);
979
980         if (!NT_STATUS_IS_OK(status)) {
981                 d_fprintf(stderr, _("Creating %s failed with %s\n"),
982                           argv[0], nt_errstr(status));
983                 return -1;
984         }
985
986         d_printf(_("Created domain group %s with RID %d\n"), argv[0], rid);
987
988         return 0;
989 }
990
991 /*
992  * Delete a domain group
993  */
994
995 static int net_sam_deletedomaingroup(struct net_context *c, int argc,
996                                      const char **argv)
997 {
998         struct dom_sid sid;
999         uint32_t rid;
1000         enum lsa_SidType type;
1001         const char *dom, *name;
1002         NTSTATUS status;
1003
1004         if (argc != 1 || c->display_usage) {
1005                 d_fprintf(stderr, "%s\n%s",
1006                           _("Usage:"),
1007                           _("net sam deletelocalgroup <name>\n"));
1008                 return -1;
1009         }
1010
1011         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1012                          &dom, &name, &sid, &type)) {
1013                 d_fprintf(stderr, _("Could not find %s.\n"), argv[0]);
1014                 return -1;
1015         }
1016
1017         if (type != SID_NAME_DOM_GRP) {
1018                 d_fprintf(stderr, _("%s is a %s, not a domain group.\n"),
1019                           argv[0], sid_type_lookup(type));
1020                 return -1;
1021         }
1022
1023         sid_peek_rid(&sid, &rid);
1024
1025         status = pdb_delete_dom_group(talloc_tos(), rid);
1026
1027         if (!NT_STATUS_IS_OK(status)) {
1028                 d_fprintf(stderr,_("Deleting domain group %s failed with %s\n"),
1029                           argv[0], nt_errstr(status));
1030                 return -1;
1031         }
1032
1033         d_printf(_("Deleted domain group %s.\n"), argv[0]);
1034
1035         return 0;
1036 }
1037
1038 /*
1039  * Create a local group
1040  */
1041
1042 static int net_sam_createlocalgroup(struct net_context *c, int argc, const char **argv)
1043 {
1044         NTSTATUS status;
1045         uint32 rid;
1046
1047         if (argc != 1 || c->display_usage) {
1048                 d_fprintf(stderr, "%s\n%s",
1049                           _("Usage:"),
1050                           _("net sam createlocalgroup <name>\n"));
1051                 return -1;
1052         }
1053
1054         if (!winbind_ping()) {
1055                 d_fprintf(stderr, _("winbind seems not to run. "
1056                           "createlocalgroup only works when winbind runs.\n"));
1057                 return -1;
1058         }
1059
1060         status = pdb_create_alias(argv[0], &rid);
1061
1062         if (!NT_STATUS_IS_OK(status)) {
1063                 d_fprintf(stderr, _("Creating %s failed with %s\n"),
1064                           argv[0], nt_errstr(status));
1065                 return -1;
1066         }
1067
1068         d_printf(_("Created local group %s with RID %d\n"), argv[0], rid);
1069
1070         return 0;
1071 }
1072
1073 /*
1074  * Delete a local group
1075  */
1076
1077 static int net_sam_deletelocalgroup(struct net_context *c, int argc, const char **argv)
1078 {
1079         struct dom_sid sid;
1080         enum lsa_SidType type;
1081         const char *dom, *name;
1082         NTSTATUS status;
1083
1084         if (argc != 1 || c->display_usage) {
1085                 d_fprintf(stderr, "%s\n%s",
1086                           _("Usage:"),
1087                           _("net sam deletelocalgroup <name>\n"));
1088                 return -1;
1089         }
1090
1091         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1092                          &dom, &name, &sid, &type)) {
1093                 d_fprintf(stderr,_("Could not find %s.\n"), argv[0]);
1094                 return -1;
1095         }
1096
1097         if (type != SID_NAME_ALIAS) {
1098                 d_fprintf(stderr, _("%s is a %s, not a local group.\n"),argv[0],
1099                           sid_type_lookup(type));
1100                 return -1;
1101         }
1102
1103         status = pdb_delete_alias(&sid);
1104
1105         if (!NT_STATUS_IS_OK(status)) {
1106                 d_fprintf(stderr, _("Deleting local group %s failed with %s\n"),
1107                           argv[0], nt_errstr(status));
1108                 return -1;
1109         }
1110
1111         d_printf(_("Deleted local group %s.\n"), argv[0]);
1112
1113         return 0;
1114 }
1115
1116 /*
1117  * Create a builtin group
1118  */
1119
1120 static int net_sam_createbuiltingroup(struct net_context *c, int argc, const char **argv)
1121 {
1122         NTSTATUS status;
1123         uint32 rid;
1124         enum lsa_SidType type;
1125         fstring groupname;
1126         struct dom_sid sid;
1127
1128         if (argc != 1 || c->display_usage) {
1129                 d_fprintf(stderr, "%s\n%s",
1130                           _("Usage:"),
1131                           _("net sam createbuiltingroup <name>\n"));
1132                 return -1;
1133         }
1134
1135         if (!winbind_ping()) {
1136                 d_fprintf(stderr, _("winbind seems not to run. "
1137                           "createbuiltingroup only works when winbind "
1138                           "runs.\n"));
1139                 return -1;
1140         }
1141
1142         /* validate the name and get the group */
1143
1144         fstrcpy( groupname, "BUILTIN\\" );
1145         fstrcat( groupname, argv[0] );
1146
1147         if ( !lookup_name(talloc_tos(), groupname, LOOKUP_NAME_ALL, NULL,
1148                           NULL, &sid, &type)) {
1149                 d_fprintf(stderr, _("%s is not a BUILTIN group\n"), argv[0]);
1150                 return -1;
1151         }
1152
1153         if ( !sid_peek_rid( &sid, &rid ) ) {
1154                 d_fprintf(stderr, _("Failed to get RID for %s\n"), argv[0]);
1155                 return -1;
1156         }
1157
1158         status = pdb_create_builtin(rid);
1159
1160         if (!NT_STATUS_IS_OK(status)) {
1161                 d_fprintf(stderr, _("Creating %s failed with %s\n"),
1162                           argv[0], nt_errstr(status));
1163                 return -1;
1164         }
1165
1166         d_printf(_("Created BUILTIN group %s with RID %d\n"), argv[0], rid);
1167
1168         return 0;
1169 }
1170
1171 /*
1172  * Add a group member
1173  */
1174
1175 static int net_sam_addmem(struct net_context *c, int argc, const char **argv)
1176 {
1177         const char *groupdomain, *groupname, *memberdomain, *membername;
1178         struct dom_sid group, member;
1179         enum lsa_SidType grouptype, membertype;
1180         NTSTATUS status;
1181
1182         if (argc != 2 || c->display_usage) {
1183                 d_fprintf(stderr, "%s\n%s",
1184                           _("Usage:"),
1185                           _("net sam addmem <group> <member>\n"));
1186                 return -1;
1187         }
1188
1189         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1190                          &groupdomain, &groupname, &group, &grouptype)) {
1191                 d_fprintf(stderr, _("Could not find group %s\n"), argv[0]);
1192                 return -1;
1193         }
1194
1195         /* check to see if the member to be added is a name or a SID */
1196
1197         if (!lookup_name(talloc_tos(), argv[1], LOOKUP_NAME_LOCAL,
1198                          &memberdomain, &membername, &member, &membertype))
1199         {
1200                 /* try it as a SID */
1201
1202                 if ( !string_to_sid( &member, argv[1] ) ) {
1203                         d_fprintf(stderr, _("Could not find member %s\n"),
1204                                   argv[1]);
1205                         return -1;
1206                 }
1207
1208                 if ( !lookup_sid(talloc_tos(), &member, &memberdomain,
1209                         &membername, &membertype) )
1210                 {
1211                         d_fprintf(stderr, _("Could not resolve SID %s\n"),
1212                                   argv[1]);
1213                         return -1;
1214                 }
1215         }
1216
1217         if ((grouptype == SID_NAME_ALIAS) || (grouptype == SID_NAME_WKN_GRP)) {
1218                 if ((membertype != SID_NAME_USER) &&
1219                     (membertype != SID_NAME_DOM_GRP)) {
1220                         d_fprintf(stderr, _("%s is a local group, only users "
1221                                   "and domain groups can be added.\n"
1222                                   "%s is a %s\n"), argv[0], argv[1],
1223                                   sid_type_lookup(membertype));
1224                         return -1;
1225                 }
1226                 status = pdb_add_aliasmem(&group, &member);
1227
1228                 if (!NT_STATUS_IS_OK(status)) {
1229                         d_fprintf(stderr, _("Adding local group member failed "
1230                                   "with %s\n"), nt_errstr(status));
1231                         return -1;
1232                 }
1233         } else if (grouptype == SID_NAME_DOM_GRP) {
1234                 uint32_t grouprid, memberrid;
1235
1236                 sid_peek_rid(&group, &grouprid);
1237                 sid_peek_rid(&member, &memberrid);
1238
1239                 status = pdb_add_groupmem(talloc_tos(), grouprid, memberrid);
1240                 if (!NT_STATUS_IS_OK(status)) {
1241                         d_fprintf(stderr, _("Adding domain group member failed "
1242                                   "with %s\n"), nt_errstr(status));
1243                         return -1;
1244                 }
1245         } else {
1246                 d_fprintf(stderr, _("Can only add members to local groups so "
1247                           "far, %s is a %s\n"), argv[0],
1248                           sid_type_lookup(grouptype));
1249                 return -1;
1250         }
1251
1252         d_printf(_("Added %s\\%s to %s\\%s\n"), memberdomain, membername,
1253                 groupdomain, groupname);
1254
1255         return 0;
1256 }
1257
1258 /*
1259  * Delete a group member
1260  */
1261
1262 static int net_sam_delmem(struct net_context *c, int argc, const char **argv)
1263 {
1264         const char *groupdomain, *groupname;
1265         const char *memberdomain = NULL;
1266         const char *membername = NULL;
1267         struct dom_sid group, member;
1268         enum lsa_SidType grouptype;
1269         NTSTATUS status;
1270
1271         if (argc != 2 || c->display_usage) {
1272                 d_fprintf(stderr,"%s\n%s",
1273                           _("Usage:"),
1274                           _("net sam delmem <group> <member>\n"));
1275                 return -1;
1276         }
1277
1278         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1279                          &groupdomain, &groupname, &group, &grouptype)) {
1280                 d_fprintf(stderr, _("Could not find group %s\n"), argv[0]);
1281                 return -1;
1282         }
1283
1284         if (!lookup_name(talloc_tos(), argv[1], LOOKUP_NAME_LOCAL,
1285                          &memberdomain, &membername, &member, NULL)) {
1286                 if (!string_to_sid(&member, argv[1])) {
1287                         d_fprintf(stderr, _("Could not find member %s\n"),
1288                                   argv[1]);
1289                         return -1;
1290                 }
1291         }
1292
1293         if ((grouptype == SID_NAME_ALIAS) ||
1294             (grouptype == SID_NAME_WKN_GRP)) {
1295                 status = pdb_del_aliasmem(&group, &member);
1296
1297                 if (!NT_STATUS_IS_OK(status)) {
1298                         d_fprintf(stderr,_("Deleting local group member failed "
1299                                   "with %s\n"), nt_errstr(status));
1300                         return -1;
1301                 }
1302         } else if (grouptype == SID_NAME_DOM_GRP) {
1303                 uint32_t grouprid, memberrid;
1304
1305                 sid_peek_rid(&group, &grouprid);
1306                 sid_peek_rid(&member, &memberrid);
1307
1308                 status = pdb_del_groupmem(talloc_tos(), grouprid, memberrid);
1309                 if (!NT_STATUS_IS_OK(status)) {
1310                         d_fprintf(stderr, _("Deleting domain group member "
1311                                   "failed with %s\n"), nt_errstr(status));
1312                         return -1;
1313                 }
1314         } else {
1315                 d_fprintf(stderr, _("Can only delete members from local groups "
1316                           "so far, %s is a %s\n"), argv[0],
1317                           sid_type_lookup(grouptype));
1318                 return -1;
1319         }
1320
1321         if (membername != NULL) {
1322                 d_printf(_("Deleted %s\\%s from %s\\%s\n"),
1323                          memberdomain, membername, groupdomain, groupname);
1324         } else {
1325                 d_printf(_("Deleted %s from %s\\%s\n"),
1326                          sid_string_tos(&member), groupdomain, groupname);
1327         }
1328
1329         return 0;
1330 }
1331
1332 /*
1333  * List group members
1334  */
1335
1336 static int net_sam_listmem(struct net_context *c, int argc, const char **argv)
1337 {
1338         const char *groupdomain, *groupname;
1339         struct dom_sid group;
1340         struct dom_sid *members = NULL;
1341         size_t i, num_members = 0;
1342         enum lsa_SidType grouptype;
1343         NTSTATUS status;
1344
1345         if (argc != 1 || c->display_usage) {
1346                 d_fprintf(stderr, "%s\n%s",
1347                           _("Usage:"),
1348                           _("net sam listmem <group>\n"));
1349                 return -1;
1350         }
1351
1352         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1353                          &groupdomain, &groupname, &group, &grouptype)) {
1354                 d_fprintf(stderr, _("Could not find group %s\n"), argv[0]);
1355                 return -1;
1356         }
1357
1358         if ((grouptype == SID_NAME_ALIAS) ||
1359             (grouptype == SID_NAME_WKN_GRP)) {
1360                 status = pdb_enum_aliasmem(&group, talloc_tos(), &members,
1361                                            &num_members);
1362                 if (!NT_STATUS_IS_OK(status)) {
1363                         d_fprintf(stderr, _("Listing group members failed with "
1364                                   "%s\n"), nt_errstr(status));
1365                         return -1;
1366                 }
1367         } else if (grouptype == SID_NAME_DOM_GRP) {
1368                 uint32_t *rids;
1369
1370                 status = pdb_enum_group_members(talloc_tos(), &group,
1371                                                 &rids, &num_members);
1372                 if (!NT_STATUS_IS_OK(status)) {
1373                         d_fprintf(stderr, _("Listing group members failed with "
1374                                   "%s\n"), nt_errstr(status));
1375                         return -1;
1376                 }
1377
1378                 members = talloc_array(talloc_tos(), struct dom_sid,
1379                                        num_members);
1380                 if (members == NULL) {
1381                         TALLOC_FREE(rids);
1382                         return -1;
1383                 }
1384
1385                 for (i=0; i<num_members; i++) {
1386                         sid_compose(&members[i], get_global_sam_sid(),
1387                                     rids[i]);
1388                 }
1389                 TALLOC_FREE(rids);
1390         } else {
1391                 d_fprintf(stderr,_("Can only list local group members so far.\n"
1392                           "%s is a %s\n"), argv[0], sid_type_lookup(grouptype));
1393                 return -1;
1394         }
1395
1396         d_printf(_("%s\\%s has %u members\n"), groupdomain, groupname,
1397                  (unsigned int)num_members);
1398         for (i=0; i<num_members; i++) {
1399                 const char *dom, *name;
1400                 if (lookup_sid(talloc_tos(), &members[i], &dom, &name, NULL)) {
1401                         d_printf(" %s\\%s\n", dom, name);
1402                 } else {
1403                         d_printf(" %s\n", sid_string_tos(&members[i]));
1404                 }
1405         }
1406
1407                 TALLOC_FREE(members);
1408
1409         return 0;
1410 }
1411
1412 /*
1413  * Do the listing
1414  */
1415 static int net_sam_do_list(struct net_context *c, int argc, const char **argv,
1416                            struct pdb_search *search, const char *what)
1417 {
1418         bool verbose = (argc == 1);
1419
1420         if ((argc > 1) || c->display_usage ||
1421             ((argc == 1) && !strequal(argv[0], "verbose"))) {
1422                 d_fprintf(stderr, "%s\n", _("Usage:"));
1423                 d_fprintf(stderr, _("net sam list %s [verbose]\n"), what);
1424                 return -1;
1425         }
1426
1427         if (search == NULL) {
1428                 d_fprintf(stderr, _("Could not start search\n"));
1429                 return -1;
1430         }
1431
1432         while (true) {
1433                 struct samr_displayentry entry;
1434                 if (!search->next_entry(search, &entry)) {
1435                         break;
1436                 }
1437                 if (verbose) {
1438                         d_printf("%s:%d:%s\n",
1439                                  entry.account_name,
1440                                  entry.rid,
1441                                  entry.description);
1442                 } else {
1443                         d_printf("%s\n", entry.account_name);
1444                 }
1445         }
1446
1447         TALLOC_FREE(search);
1448         return 0;
1449 }
1450
1451 static int net_sam_list_users(struct net_context *c, int argc,
1452                               const char **argv)
1453 {
1454         return net_sam_do_list(c, argc, argv,
1455                                pdb_search_users(talloc_tos(), ACB_NORMAL),
1456                                "users");
1457 }
1458
1459 static int net_sam_list_groups(struct net_context *c, int argc,
1460                                const char **argv)
1461 {
1462         return net_sam_do_list(c, argc, argv, pdb_search_groups(talloc_tos()),
1463                                "groups");
1464 }
1465
1466 static int net_sam_list_localgroups(struct net_context *c, int argc,
1467                                     const char **argv)
1468 {
1469         return net_sam_do_list(c, argc, argv,
1470                                pdb_search_aliases(talloc_tos(),
1471                                                   get_global_sam_sid()),
1472                                "localgroups");
1473 }
1474
1475 static int net_sam_list_builtin(struct net_context *c, int argc,
1476                                 const char **argv)
1477 {
1478         return net_sam_do_list(c, argc, argv,
1479                                pdb_search_aliases(talloc_tos(),
1480                                                   &global_sid_Builtin),
1481                                "builtin");
1482 }
1483
1484 static int net_sam_list_workstations(struct net_context *c, int argc,
1485                                      const char **argv)
1486 {
1487         return net_sam_do_list(c, argc, argv,
1488                                pdb_search_users(talloc_tos(), ACB_WSTRUST),
1489                                "workstations");
1490 }
1491
1492 /*
1493  * List stuff
1494  */
1495
1496 static int net_sam_list(struct net_context *c, int argc, const char **argv)
1497 {
1498         struct functable func[] = {
1499                 {
1500                         "users",
1501                         net_sam_list_users,
1502                         NET_TRANSPORT_LOCAL,
1503                         N_("List SAM users"),
1504                         N_("net sam list users\n"
1505                            "    List SAM users")
1506                 },
1507                 {
1508                         "groups",
1509                         net_sam_list_groups,
1510                         NET_TRANSPORT_LOCAL,
1511                         N_("List SAM groups"),
1512                         N_("net sam list groups\n"
1513                            "    List SAM groups")
1514                 },
1515                 {
1516                         "localgroups",
1517                         net_sam_list_localgroups,
1518                         NET_TRANSPORT_LOCAL,
1519                         N_("List SAM local groups"),
1520                         N_("net sam list localgroups\n"
1521                            "    List SAM local groups")
1522                 },
1523                 {
1524                         "builtin",
1525                         net_sam_list_builtin,
1526                         NET_TRANSPORT_LOCAL,
1527                         N_("List builtin groups"),
1528                         N_("net sam list builtin\n"
1529                            "    List builtin groups")
1530                 },
1531                 {
1532                         "workstations",
1533                         net_sam_list_workstations,
1534                         NET_TRANSPORT_LOCAL,
1535                         N_("List domain member workstations"),
1536                         N_("net sam list workstations\n"
1537                            "    List domain member workstations")
1538                 },
1539                 {NULL, NULL, 0, NULL, NULL}
1540         };
1541
1542         return net_run_function(c, argc, argv, "net sam list", func);
1543 }
1544
1545 /*
1546  * Show details of SAM entries
1547  */
1548
1549 static int net_sam_show(struct net_context *c, int argc, const char **argv)
1550 {
1551         struct dom_sid sid;
1552         enum lsa_SidType type;
1553         const char *dom, *name;
1554
1555         if (argc != 1 || c->display_usage) {
1556                 d_fprintf(stderr, "%s\n%s",
1557                           _("Usage:"),
1558                           _("net sam show <name>\n"));
1559                 return -1;
1560         }
1561
1562         if (!lookup_name(talloc_tos(), argv[0], LOOKUP_NAME_LOCAL,
1563                          &dom, &name, &sid, &type)) {
1564                 d_fprintf(stderr, _("Could not find name %s\n"), argv[0]);
1565                 return -1;
1566         }
1567
1568         d_printf(_("%s\\%s is a %s with SID %s\n"), dom, name,
1569                  sid_type_lookup(type), sid_string_tos(&sid));
1570
1571         return 0;
1572 }
1573
1574 #ifdef HAVE_LDAP
1575
1576 /*
1577  * Init an LDAP tree with default users and Groups
1578  * if ldapsam:editposix is enabled
1579  */
1580
1581 static int net_sam_provision(struct net_context *c, int argc, const char **argv)
1582 {
1583         TALLOC_CTX *tc;
1584         char *ldap_bk;
1585         char *ldap_uri = NULL;
1586         char *p;
1587         struct smbldap_state *state = NULL;
1588         GROUP_MAP *gmap = NULL;
1589         struct dom_sid gsid;
1590         gid_t domusers_gid = -1;
1591         gid_t domadmins_gid = -1;
1592         struct samu *samuser;
1593         struct passwd *pwd;
1594         bool is_ipa = false;
1595         char *bind_dn = NULL;
1596         char *bind_secret = NULL;
1597         NTSTATUS status;
1598
1599         if (c->display_usage) {
1600                 d_printf(  "%s\n"
1601                            "net sam provision\n"
1602                             "    %s\n",
1603                           _("Usage:"),
1604                           _("Init an LDAP tree with default users/groups"));
1605                 return 0;
1606         }
1607
1608         tc = talloc_new(NULL);
1609         if (!tc) {
1610                 d_fprintf(stderr, _("Out of Memory!\n"));
1611                 return -1;
1612         }
1613
1614         if ((ldap_bk = talloc_strdup(tc, lp_passdb_backend())) == NULL) {
1615                 d_fprintf(stderr, _("talloc failed\n"));
1616                 talloc_free(tc);
1617                 return -1;
1618         }
1619         p = strchr(ldap_bk, ':');
1620         if (p) {
1621                 *p = 0;
1622                 ldap_uri = talloc_strdup(tc, p+1);
1623                 trim_char(ldap_uri, ' ', ' ');
1624         }
1625
1626         trim_char(ldap_bk, ' ', ' ');
1627
1628         if (strcmp(ldap_bk, "IPA_ldapsam") == 0 ) {
1629                 is_ipa = true;
1630         }
1631
1632         if (strcmp(ldap_bk, "ldapsam") != 0 && !is_ipa ) {
1633                 d_fprintf(stderr,
1634                           _("Provisioning works only with ldapsam backend\n"));
1635                 goto failed;
1636         }
1637
1638         if (!lp_parm_bool(-1, "ldapsam", "trusted", false) ||
1639             !lp_parm_bool(-1, "ldapsam", "editposix", false)) {
1640
1641                 d_fprintf(stderr, _("Provisioning works only if ldapsam:trusted"
1642                                     " and ldapsam:editposix are enabled.\n"));
1643                 goto failed;
1644         }
1645
1646         if (!is_ipa && !winbind_ping()) {
1647                 d_fprintf(stderr, _("winbind seems not to run. Provisioning "
1648                             "LDAP only works when winbind runs.\n"));
1649                 goto failed;
1650         }
1651
1652         if (!fetch_ldap_pw(&bind_dn, &bind_secret)) {
1653                 d_fprintf(stderr, _("Failed to retrieve LDAP password from secrets.tdb\n"));
1654                 goto failed;
1655         }
1656
1657         status = smbldap_init(tc, NULL, ldap_uri, false, bind_dn, bind_secret, &state);
1658
1659         memset(bind_secret, '\0', strlen(bind_secret));
1660         SAFE_FREE(bind_secret);
1661         SAFE_FREE(bind_dn);
1662
1663         if (!NT_STATUS_IS_OK(status)) {
1664                 d_fprintf(stderr, _("Unable to connect to the LDAP server.\n"));
1665                 goto failed;
1666         }
1667
1668         d_printf(_("Checking for Domain Users group.\n"));
1669
1670         sid_compose(&gsid, get_global_sam_sid(), DOMAIN_RID_USERS);
1671
1672         gmap = talloc_zero(tc, GROUP_MAP);
1673         if (!gmap) {
1674                 d_printf(_("Out of memory!\n"));
1675                 goto failed;
1676         }
1677
1678         if (!pdb_getgrsid(gmap, gsid)) {
1679                 LDAPMod **mods = NULL;
1680                 char *dn;
1681                 char *uname;
1682                 char *wname;
1683                 char *gidstr;
1684                 char *gtype;
1685                 int rc;
1686
1687                 d_printf(_("Adding the Domain Users group.\n"));
1688
1689                 /* lets allocate a new groupid for this group */
1690                 if (is_ipa) {
1691                         domusers_gid = 999;
1692                 } else {
1693                         if (!winbind_allocate_gid(&domusers_gid)) {
1694                                 d_fprintf(stderr, _("Unable to allocate a new gid to "
1695                                                     "create Domain Users group!\n"));
1696                                 goto domu_done;
1697                         }
1698                 }
1699
1700                 uname = talloc_strdup(tc, "domusers");
1701                 wname = talloc_strdup(tc, "Domain Users");
1702                 dn = talloc_asprintf(tc, "cn=%s,%s", "domusers",
1703                                      lp_ldap_group_suffix(talloc_tos()));
1704                 gidstr = talloc_asprintf(tc, "%u", (unsigned int)domusers_gid);
1705                 gtype = talloc_asprintf(tc, "%d", SID_NAME_DOM_GRP);
1706
1707                 if (!uname || !wname || !dn || !gidstr || !gtype) {
1708                         d_fprintf(stderr, "Out of Memory!\n");
1709                         goto failed;
1710                 }
1711
1712                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_POSIXGROUP);
1713                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_GROUPMAP);
1714                 if (is_ipa) {
1715                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "groupofnames");
1716                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "nestedgroup");
1717                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "ipausergroup");
1718                 }
1719                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "cn", uname);
1720                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "displayName", wname);
1721                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "gidNumber", gidstr);
1722                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaSid",
1723                                 sid_string_talloc(tc, &gsid));
1724                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaGroupType", gtype);
1725
1726                 smbldap_talloc_autofree_ldapmod(tc, mods);
1727
1728                 rc = smbldap_add(state, dn, mods);
1729
1730                 if (rc != LDAP_SUCCESS) {
1731                         d_fprintf(stderr, _("Failed to add Domain Users group "
1732                                             "to ldap directory\n"));
1733                 }
1734
1735                 if (is_ipa) {
1736                         if (!pdb_getgrsid(gmap, gsid)) {
1737                                 d_fprintf(stderr, _("Failed to read just "
1738                                                     "created domain group.\n"));
1739                                 goto failed;
1740                         } else {
1741                                 domusers_gid = gmap->gid;
1742                         }
1743                 }
1744         } else {
1745                 domusers_gid = gmap->gid;
1746                 d_printf(_("found!\n"));
1747         }
1748
1749 domu_done:
1750
1751         d_printf(_("Checking for Domain Admins group.\n"));
1752
1753         sid_compose(&gsid, get_global_sam_sid(), DOMAIN_RID_ADMINS);
1754
1755         if (!pdb_getgrsid(gmap, gsid)) {
1756                 LDAPMod **mods = NULL;
1757                 char *dn;
1758                 char *uname;
1759                 char *wname;
1760                 char *gidstr;
1761                 char *gtype;
1762                 int rc;
1763
1764                 d_printf(_("Adding the Domain Admins group.\n"));
1765
1766                 /* lets allocate a new groupid for this group */
1767                 if (is_ipa) {
1768                         domadmins_gid = 999;
1769                 } else {
1770                         if (!winbind_allocate_gid(&domadmins_gid)) {
1771                                 d_fprintf(stderr, _("Unable to allocate a new gid to "
1772                                                     "create Domain Admins group!\n"));
1773                                 goto doma_done;
1774                         }
1775                 }
1776
1777                 uname = talloc_strdup(tc, "domadmins");
1778                 wname = talloc_strdup(tc, "Domain Admins");
1779                 dn = talloc_asprintf(tc, "cn=%s,%s", "domadmins",
1780                                      lp_ldap_group_suffix(talloc_tos()));
1781                 gidstr = talloc_asprintf(tc, "%u", (unsigned int)domadmins_gid);
1782                 gtype = talloc_asprintf(tc, "%d", SID_NAME_DOM_GRP);
1783
1784                 if (!uname || !wname || !dn || !gidstr || !gtype) {
1785                         d_fprintf(stderr, _("Out of Memory!\n"));
1786                         goto failed;
1787                 }
1788
1789                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_POSIXGROUP);
1790                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_GROUPMAP);
1791                 if (is_ipa) {
1792                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "groupofnames");
1793                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "nestedgroup");
1794                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "ipausergroup");
1795                 }
1796                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "cn", uname);
1797                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "displayName", wname);
1798                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "gidNumber", gidstr);
1799                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaSid",
1800                                 sid_string_talloc(tc, &gsid));
1801                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaGroupType", gtype);
1802
1803                 smbldap_talloc_autofree_ldapmod(tc, mods);
1804
1805                 rc = smbldap_add(state, dn, mods);
1806
1807                 if (rc != LDAP_SUCCESS) {
1808                         d_fprintf(stderr, _("Failed to add Domain Admins group "
1809                                             "to ldap directory\n"));
1810                 }
1811
1812                 if (is_ipa) {
1813                         if (!pdb_getgrsid(gmap, gsid)) {
1814                                 d_fprintf(stderr, _("Failed to read just "
1815                                                     "created domain group.\n"));
1816                                 goto failed;
1817                         } else {
1818                                 domadmins_gid = gmap->gid;
1819                         }
1820                 }
1821         } else {
1822                 domadmins_gid = gmap->gid;
1823                 d_printf(_("found!\n"));
1824         }
1825
1826 doma_done:
1827
1828         d_printf(_("Check for Administrator account.\n"));
1829
1830         samuser = samu_new(tc);
1831         if (!samuser) {
1832                 d_fprintf(stderr, _("Out of Memory!\n"));
1833                 goto failed;
1834         }
1835
1836         if (!pdb_getsampwnam(samuser, "Administrator")) {
1837                 LDAPMod **mods = NULL;
1838                 struct dom_sid sid;
1839                 char *dn;
1840                 char *name;
1841                 char *uidstr;
1842                 char *gidstr;
1843                 char *shell;
1844                 char *dir;
1845                 char *princ;
1846                 uid_t uid;
1847                 int rc;
1848
1849                 d_printf(_("Adding the Administrator user.\n"));
1850
1851                 if (domadmins_gid == -1) {
1852                         d_fprintf(stderr,
1853                                   _("Can't create Administrator user, Domain "
1854                                     "Admins group not available!\n"));
1855                         goto done;
1856                 }
1857
1858                 if (is_ipa) {
1859                         uid = 999;
1860                 } else {
1861                         if (!winbind_allocate_uid(&uid)) {
1862                                 d_fprintf(stderr,
1863                                           _("Unable to allocate a new uid to create "
1864                                             "the Administrator user!\n"));
1865                                 goto done;
1866                         }
1867                 }
1868
1869                 name = talloc_strdup(tc, "Administrator");
1870                 dn = talloc_asprintf(tc, "uid=Administrator,%s",
1871                                      lp_ldap_user_suffix(talloc_tos()));
1872                 uidstr = talloc_asprintf(tc, "%u", (unsigned int)uid);
1873                 gidstr = talloc_asprintf(tc, "%u", (unsigned int)domadmins_gid);
1874                 dir = talloc_sub_specified(tc, lp_template_homedir(),
1875                                                 "Administrator",
1876                                                 get_global_sam_name(),
1877                                                 uid, domadmins_gid);
1878                 shell = talloc_sub_specified(tc, lp_template_shell(),
1879                                                 "Administrator",
1880                                                 get_global_sam_name(),
1881                                                 uid, domadmins_gid);
1882
1883                 if (!name || !dn || !uidstr || !gidstr || !dir || !shell) {
1884                         d_fprintf(stderr, _("Out of Memory!\n"));
1885                         goto failed;
1886                 }
1887
1888                 sid_compose(&sid, get_global_sam_sid(), DOMAIN_RID_ADMINISTRATOR);
1889
1890                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_ACCOUNT);
1891                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_POSIXACCOUNT);
1892                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_SAMBASAMACCOUNT);
1893                 if (is_ipa) {
1894                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "person");
1895                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "organizationalperson");
1896                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "inetorgperson");
1897                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "inetuser");
1898                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "krbprincipalaux");
1899                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "krbticketpolicyaux");
1900                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "sn", name);
1901                         princ = talloc_asprintf(tc, "%s@%s", name, lp_realm());
1902                         if (!princ) {
1903                                 d_fprintf(stderr, _("Out of Memory!\n"));
1904                                 goto failed;
1905                         }
1906                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "krbPrincipalName", princ);
1907                 }
1908                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "uid", name);
1909                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "cn", name);
1910                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "displayName", name);
1911                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "uidNumber", uidstr);
1912                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "gidNumber", gidstr);
1913                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "homeDirectory", dir);
1914                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "loginShell", shell);
1915                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaSID",
1916                                 sid_string_talloc(tc, &sid));
1917                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaAcctFlags",
1918                                 pdb_encode_acct_ctrl(ACB_NORMAL|ACB_DISABLED,
1919                                 NEW_PW_FORMAT_SPACE_PADDED_LEN));
1920
1921                 smbldap_talloc_autofree_ldapmod(tc, mods);
1922
1923                 rc = smbldap_add(state, dn, mods);
1924
1925                 if (rc != LDAP_SUCCESS) {
1926                         d_fprintf(stderr, _("Failed to add Administrator user "
1927                                             "to ldap directory\n"));
1928                 }
1929
1930                 if (is_ipa) {
1931                         if (!pdb_getsampwnam(samuser, "Administrator")) {
1932                                 d_fprintf(stderr, _("Failed to read just "
1933                                                     "created user.\n"));
1934                                 goto failed;
1935                         }
1936                 }
1937         } else {
1938                 d_printf(_("found!\n"));
1939         }
1940
1941         d_printf(_("Checking for Guest user.\n"));
1942
1943         samuser = samu_new(tc);
1944         if (!samuser) {
1945                 d_fprintf(stderr, _("Out of Memory!\n"));
1946                 goto failed;
1947         }
1948
1949         if (!pdb_getsampwnam(samuser, lp_guestaccount())) {
1950                 LDAPMod **mods = NULL;
1951                 struct dom_sid sid;
1952                 char *dn;
1953                 char *uidstr;
1954                 char *gidstr;
1955                 int rc;
1956
1957                 d_printf(_("Adding the Guest user.\n"));
1958
1959                 sid_compose(&sid, get_global_sam_sid(), DOMAIN_RID_GUEST);
1960
1961                 pwd = Get_Pwnam_alloc(tc, lp_guestaccount());
1962
1963                 if (!pwd) {
1964                         if (domusers_gid == -1) {
1965                                 d_fprintf(stderr,
1966                                           _("Can't create Guest user, Domain "
1967                                             "Users group not available!\n"));
1968                                 goto done;
1969                         }
1970                         if ((pwd = talloc(tc, struct passwd)) == NULL) {
1971                                 d_fprintf(stderr, _("talloc failed\n"));
1972                                 goto done;
1973                         }
1974                         pwd->pw_name = talloc_strdup(pwd, lp_guestaccount());
1975
1976                         if (is_ipa) {
1977                                 pwd->pw_uid = 999;
1978                         } else {
1979                                 if (!winbind_allocate_uid(&(pwd->pw_uid))) {
1980                                         d_fprintf(stderr,
1981                                                   _("Unable to allocate a new uid to "
1982                                                     "create the Guest user!\n"));
1983                                         goto done;
1984                                 }
1985                         }
1986                         pwd->pw_gid = domusers_gid;
1987                         pwd->pw_dir = talloc_strdup(tc, "/");
1988                         pwd->pw_shell = talloc_strdup(tc, "/bin/false");
1989                         if (!pwd->pw_dir || !pwd->pw_shell) {
1990                                 d_fprintf(stderr, _("Out of Memory!\n"));
1991                                 goto failed;
1992                         }
1993                 }
1994
1995                 dn = talloc_asprintf(tc, "uid=%s,%s", pwd->pw_name,
1996                                      lp_ldap_user_suffix (talloc_tos()));
1997                 uidstr = talloc_asprintf(tc, "%u", (unsigned int)pwd->pw_uid);
1998                 gidstr = talloc_asprintf(tc, "%u", (unsigned int)pwd->pw_gid);
1999                 if (!dn || !uidstr || !gidstr) {
2000                         d_fprintf(stderr, _("Out of Memory!\n"));
2001                         goto failed;
2002                 }
2003
2004                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_ACCOUNT);
2005                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_POSIXACCOUNT);
2006                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_SAMBASAMACCOUNT);
2007                 if (is_ipa) {
2008                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "person");
2009                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "organizationalperson");
2010                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "inetorgperson");
2011                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "inetuser");
2012                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "krbprincipalaux");
2013                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "krbticketpolicyaux");
2014                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "sn", pwd->pw_name);
2015                 }
2016                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "uid", pwd->pw_name);
2017                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "cn", pwd->pw_name);
2018                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "displayName", pwd->pw_name);
2019                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "uidNumber", uidstr);
2020                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "gidNumber", gidstr);
2021                 if ((pwd->pw_dir != NULL) && (pwd->pw_dir[0] != '\0')) {
2022                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "homeDirectory", pwd->pw_dir);
2023                 }
2024                 if ((pwd->pw_shell != NULL) && (pwd->pw_shell[0] != '\0')) {
2025                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "loginShell", pwd->pw_shell);
2026                 }
2027                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaSID",
2028                                 sid_string_talloc(tc, &sid));
2029                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaAcctFlags",
2030                                 pdb_encode_acct_ctrl(ACB_NORMAL|ACB_DISABLED,
2031                                 NEW_PW_FORMAT_SPACE_PADDED_LEN));
2032
2033                 smbldap_talloc_autofree_ldapmod(tc, mods);
2034
2035                 rc = smbldap_add(state, dn, mods);
2036
2037                 if (rc != LDAP_SUCCESS) {
2038                         d_fprintf(stderr, _("Failed to add Guest user to "
2039                                             "ldap directory\n"));
2040                 }
2041
2042                 if (is_ipa) {
2043                         if (!pdb_getsampwnam(samuser, lp_guestaccount())) {
2044                                 d_fprintf(stderr, _("Failed to read just "
2045                                                     "created user.\n"));
2046                                 goto failed;
2047                         }
2048                 }
2049         } else {
2050                 d_printf(_("found!\n"));
2051         }
2052
2053         d_printf(_("Checking Guest's group.\n"));
2054
2055         pwd = Get_Pwnam_alloc(tc, lp_guestaccount());
2056         if (!pwd) {
2057                 d_fprintf(stderr,
2058                           _("Failed to find just created Guest account!\n"
2059                             "   Is nss properly configured?!\n"));
2060                 goto failed;
2061         }
2062
2063         if (pwd->pw_gid == domusers_gid) {
2064                 d_printf(_("found!\n"));
2065                 goto done;
2066         }
2067
2068         if (!pdb_getgrgid(gmap, pwd->pw_gid)) {
2069                 LDAPMod **mods = NULL;
2070                 char *dn;
2071                 char *uname;
2072                 char *wname;
2073                 char *gidstr;
2074                 char *gtype;
2075                 int rc;
2076
2077                 d_printf(_("Adding the Domain Guests group.\n"));
2078
2079                 uname = talloc_strdup(tc, "domguests");
2080                 wname = talloc_strdup(tc, "Domain Guests");
2081                 dn = talloc_asprintf(tc, "cn=%s,%s", "domguests",
2082                                      lp_ldap_group_suffix(talloc_tos()));
2083                 gidstr = talloc_asprintf(tc, "%u", (unsigned int)pwd->pw_gid);
2084                 gtype = talloc_asprintf(tc, "%d", SID_NAME_DOM_GRP);
2085
2086                 if (!uname || !wname || !dn || !gidstr || !gtype) {
2087                         d_fprintf(stderr, _("Out of Memory!\n"));
2088                         goto failed;
2089                 }
2090
2091                 sid_compose(&gsid, get_global_sam_sid(), DOMAIN_RID_GUESTS);
2092
2093                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_POSIXGROUP);
2094                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", LDAP_OBJ_GROUPMAP);
2095                 if (is_ipa) {
2096                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "groupofnames");
2097                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "nestedgroup");
2098                         smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass", "ipausergroup");
2099                 }
2100                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "cn", uname);
2101                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "displayName", wname);
2102                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "gidNumber", gidstr);
2103                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaSid",
2104                                 sid_string_talloc(tc, &gsid));
2105                 smbldap_set_mod(&mods, LDAP_MOD_ADD, "sambaGroupType", gtype);
2106
2107                 smbldap_talloc_autofree_ldapmod(tc, mods);
2108
2109                 rc = smbldap_add(state, dn, mods);
2110
2111                 if (rc != LDAP_SUCCESS) {
2112                         d_fprintf(stderr,
2113                                   _("Failed to add Domain Guests group to ldap "
2114                                     "directory\n"));
2115                 }
2116         } else {
2117                 d_printf(_("found!\n"));
2118         }
2119
2120
2121 done:
2122         talloc_free(state);
2123         return 0;
2124
2125 failed:
2126         talloc_free(state);
2127         return -1;
2128 }
2129
2130 #endif
2131
2132 /***********************************************************
2133  migrated functionality from smbgroupedit
2134  **********************************************************/
2135 int net_sam(struct net_context *c, int argc, const char **argv)
2136 {
2137         struct functable func[] = {
2138                 {
2139                         "createbuiltingroup",
2140                         net_sam_createbuiltingroup,
2141                         NET_TRANSPORT_LOCAL,
2142                         N_("Create a new BUILTIN group"),
2143                         N_("net sam createbuiltingroup\n"
2144                            "    Create a new BUILTIN group")
2145                 },
2146                 {
2147                         "createlocalgroup",
2148                         net_sam_createlocalgroup,
2149                         NET_TRANSPORT_LOCAL,
2150                         N_("Create a new local group"),
2151                         N_("net sam createlocalgroup\n"
2152                            "    Create a new local group")
2153                 },
2154                 {
2155                         "createdomaingroup",
2156                         net_sam_createdomaingroup,
2157                         NET_TRANSPORT_LOCAL,
2158                         N_("Create a new group"),
2159                         N_("net sam createdomaingroup\n"
2160                            "    Create a new group")
2161                 },
2162                 {
2163                         "deletelocalgroup",
2164                         net_sam_deletelocalgroup,
2165                         NET_TRANSPORT_LOCAL,
2166                         N_("Delete an existing local group"),
2167                         N_("net sam deletelocalgroup\n"
2168                            "    Delete an existing local group")
2169                 },
2170                 {
2171                         "deletedomaingroup",
2172                         net_sam_deletedomaingroup,
2173                         NET_TRANSPORT_LOCAL,
2174                         N_("Delete a domain group"),
2175                         N_("net sam deletedomaingroup\n"
2176                            "    Delete a group")
2177                 },
2178                 {
2179                         "mapunixgroup",
2180                         net_sam_mapunixgroup,
2181                         NET_TRANSPORT_LOCAL,
2182                         N_("Map a unix group to a domain group"),
2183                         N_("net sam mapunixgroup\n"
2184                            "    Map a unix group to a domain group")
2185                 },
2186                 {
2187                         "unmapunixgroup",
2188                         net_sam_unmapunixgroup,
2189                         NET_TRANSPORT_LOCAL,
2190                         N_("Remove a group mapping of an unix group to a "
2191                            "domain group"),
2192                         N_("net sam unmapunixgroup\n"
2193                            "    Remove a group mapping of an unix group to a "
2194                            "domain group")
2195                 },
2196                 {
2197                         "addmem",
2198                         net_sam_addmem,
2199                         NET_TRANSPORT_LOCAL,
2200                         N_("Add a member to a group"),
2201                         N_("net sam addmem\n"
2202                         "    Add a member to a group")
2203                 },
2204                 {
2205                         "delmem",
2206                         net_sam_delmem,
2207                         NET_TRANSPORT_LOCAL,
2208                         N_("Delete a member from a group"),
2209                         N_("net sam delmem\n"
2210                            "    Delete a member from a group")
2211                 },
2212                 {
2213                         "listmem",
2214                         net_sam_listmem,
2215                         NET_TRANSPORT_LOCAL,
2216                         N_("List group members"),
2217                         N_("net sam listmem\n"
2218                            "    List group members")
2219                 },
2220                 {
2221                         "list",
2222                         net_sam_list,
2223                         NET_TRANSPORT_LOCAL,
2224                         N_("List users, groups and local groups"),
2225                         N_("net sam list\n"
2226                            "    List users, groups and local groups")
2227                 },
2228                 {
2229                         "show",
2230                         net_sam_show,
2231                         NET_TRANSPORT_LOCAL,
2232                         N_("Show details of a SAM entry"),
2233                         N_("net sam show\n"
2234                            "    Show details of a SAM entry")
2235                 },
2236                 {
2237                         "set",
2238                         net_sam_set,
2239                         NET_TRANSPORT_LOCAL,
2240                         N_("Set details of a SAM account"),
2241                         N_("net sam set\n"
2242                            "    Set details of a SAM account")
2243                 },
2244                 {
2245                         "policy",
2246                         net_sam_policy,
2247                         NET_TRANSPORT_LOCAL,
2248                         N_("Set account policies"),
2249                         N_("net sam policy\n"
2250                            "    Set account policies")
2251                 },
2252                 {
2253                         "rights",
2254                         net_sam_rights,
2255                         NET_TRANSPORT_LOCAL,
2256                         N_("Manipulate user privileges"),
2257                         N_("net sam rights\n"
2258                            "    Manipulate user privileges")
2259                 },
2260 #ifdef HAVE_LDAP
2261                 {
2262                         "provision",
2263                         net_sam_provision,
2264                         NET_TRANSPORT_LOCAL,
2265                         N_("Provision a clean user database"),
2266                         N_("net sam privison\n"
2267                            "    Provision a clear user database")
2268                 },
2269 #endif
2270                 {NULL, NULL, 0, NULL, NULL}
2271         };
2272
2273         if (getuid() != 0) {
2274                 d_fprintf(stderr, _("You are not root, most things won't "
2275                           "work\n"));
2276         }
2277
2278         return net_run_function(c, argc, argv, "net sam", func);
2279 }
2280