15331Samw /* 25331Samw * CDDL HEADER START 35331Samw * 45331Samw * The contents of this file are subject to the terms of the 55331Samw * Common Development and Distribution License (the "License"). 65331Samw * You may not use this file except in compliance with the License. 75331Samw * 85331Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95331Samw * or http://www.opensolaris.org/os/licensing. 105331Samw * See the License for the specific language governing permissions 115331Samw * and limitations under the License. 125331Samw * 135331Samw * When distributing Covered Code, include this CDDL HEADER in each 145331Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155331Samw * If applicable, add the following below this CDDL HEADER, with the 165331Samw * fields enclosed by brackets "[]" replaced with your own identifying 175331Samw * information: Portions Copyright [yyyy] [name of copyright owner] 185331Samw * 195331Samw * CDDL HEADER END 205331Samw */ 215331Samw /* 225772Sas200622 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 235331Samw * Use is subject to license terms. 245331Samw */ 255331Samw 265331Samw #pragma ident "%Z%%M% %I% %E% SMI" 275331Samw 285331Samw /* 295331Samw * This module contains smbadm CLI which offers smb configuration 305331Samw * functionalities. 315331Samw */ 325331Samw #include <stdlib.h> 335331Samw #include <stdio.h> 345331Samw #include <syslog.h> 355331Samw #include <strings.h> 365331Samw #include <limits.h> 375331Samw #include <getopt.h> 385331Samw #include <libintl.h> 395331Samw #include <zone.h> 405331Samw #include <grp.h> 415331Samw #include <libgen.h> 425331Samw 435331Samw #include <smbsrv/libsmb.h> 445331Samw 455331Samw typedef enum { 465331Samw HELP_ADD_MEMBER, 475331Samw HELP_CREATE, 485331Samw HELP_DELETE, 495331Samw HELP_DEL_MEMBER, 505331Samw HELP_GET, 515331Samw HELP_JOIN, 525331Samw HELP_LIST, 535331Samw HELP_RENAME, 545331Samw HELP_SET, 555331Samw HELP_SHOW, 56*7052Samw HELP_USER_DISABLE, 57*7052Samw HELP_USER_ENABLE 585331Samw } smbadm_help_t; 595331Samw 60*7052Samw #define SMBADM_CMDF_USER 0x01 61*7052Samw #define SMBADM_CMDF_GROUP 0x02 62*7052Samw #define SMBADM_CMDF_TYPEMASK 0x0F 636139Sjb150015 645331Samw typedef struct smbadm_cmdinfo { 655331Samw char *name; 665331Samw int (*func)(int, char **); 675331Samw smbadm_help_t usage; 686139Sjb150015 uint32_t flags; 695331Samw } smbadm_cmdinfo_t; 705331Samw 715331Samw smbadm_cmdinfo_t *curcmd; 725331Samw static char *progname; 735331Samw 745331Samw static int smbadm_join(int, char **); 755331Samw static int smbadm_list(int, char **); 765331Samw static int smbadm_group_create(int, char **); 775331Samw static int smbadm_group_delete(int, char **); 785331Samw static int smbadm_group_rename(int, char **); 795331Samw static int smbadm_group_show(int, char **); 805331Samw static int smbadm_group_getprop(int, char **); 815331Samw static int smbadm_group_setprop(int, char **); 825331Samw static int smbadm_group_addmember(int, char **); 835331Samw static int smbadm_group_delmember(int, char **); 845331Samw static int smbadm_user_disable(int, char **); 855331Samw static int smbadm_user_enable(int, char **); 865331Samw 875331Samw static smbadm_cmdinfo_t smbadm_cmdtable[] = 885331Samw { 896139Sjb150015 { "add-member", smbadm_group_addmember, HELP_ADD_MEMBER, 906139Sjb150015 SMBADM_CMDF_GROUP }, 916139Sjb150015 { "create", smbadm_group_create, HELP_CREATE, 926139Sjb150015 SMBADM_CMDF_GROUP }, 936139Sjb150015 { "delete", smbadm_group_delete, HELP_DELETE, 946139Sjb150015 SMBADM_CMDF_GROUP }, 95*7052Samw { "disable-user", smbadm_user_disable, HELP_USER_DISABLE, 96*7052Samw SMBADM_CMDF_USER }, 97*7052Samw { "enable-user", smbadm_user_enable, HELP_USER_ENABLE, 98*7052Samw SMBADM_CMDF_USER }, 996139Sjb150015 { "get", smbadm_group_getprop, HELP_GET, 1006139Sjb150015 SMBADM_CMDF_GROUP }, 1016139Sjb150015 { "join", smbadm_join, HELP_JOIN, 0 }, 1026139Sjb150015 { "list", smbadm_list, HELP_LIST, 0 }, 1036139Sjb150015 { "remove-member", smbadm_group_delmember, HELP_DEL_MEMBER, 1046139Sjb150015 SMBADM_CMDF_GROUP }, 1056139Sjb150015 { "rename", smbadm_group_rename, HELP_RENAME, 1066139Sjb150015 SMBADM_CMDF_GROUP }, 1076139Sjb150015 { "set", smbadm_group_setprop, HELP_SET, 1086139Sjb150015 SMBADM_CMDF_GROUP }, 1096139Sjb150015 { "show", smbadm_group_show, HELP_SHOW, 1106139Sjb150015 SMBADM_CMDF_GROUP }, 1115331Samw }; 1125331Samw 1135331Samw #define SMBADM_NCMD (sizeof (smbadm_cmdtable) / sizeof (smbadm_cmdtable[0])) 1145331Samw 1155331Samw typedef struct smbadm_prop { 1165331Samw char *p_name; 1175331Samw char *p_value; 1185331Samw } smbadm_prop_t; 1195331Samw 1205331Samw typedef struct smbadm_prop_handle { 1215331Samw char *p_name; 1225331Samw char *p_dispvalue; 1235331Samw int (*p_setfn)(char *, smbadm_prop_t *); 1245331Samw int (*p_getfn)(char *, smbadm_prop_t *); 1255331Samw boolean_t (*p_chkfn)(smbadm_prop_t *); 1265331Samw } smbadm_prop_handle_t; 1275331Samw 1285331Samw static boolean_t smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval); 1295331Samw static int smbadm_prop_parse(char *arg, smbadm_prop_t *prop); 1305331Samw static smbadm_prop_handle_t *smbadm_prop_gethandle(char *pname); 1315331Samw 1325331Samw static boolean_t smbadm_chkprop_priv(smbadm_prop_t *prop); 1335331Samw static int smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop); 1345331Samw static int smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop); 1355331Samw static int smbadm_setprop_backup(char *gname, smbadm_prop_t *prop); 1365331Samw static int smbadm_getprop_backup(char *gname, smbadm_prop_t *prop); 1375331Samw static int smbadm_setprop_restore(char *gname, smbadm_prop_t *prop); 1385331Samw static int smbadm_getprop_restore(char *gname, smbadm_prop_t *prop); 1395331Samw static int smbadm_setprop_desc(char *gname, smbadm_prop_t *prop); 1405331Samw static int smbadm_getprop_desc(char *gname, smbadm_prop_t *prop); 1415331Samw 1425331Samw static smbadm_prop_handle_t smbadm_ptable[] = { 1435331Samw {"backup", "on | off", smbadm_setprop_backup, 1445331Samw smbadm_getprop_backup, smbadm_chkprop_priv }, 1455331Samw {"restore", "on | off", smbadm_setprop_restore, 1465331Samw smbadm_getprop_restore, smbadm_chkprop_priv }, 1475331Samw {"take-ownership", "on | off", smbadm_setprop_tkowner, 1485331Samw smbadm_getprop_tkowner, smbadm_chkprop_priv }, 1495331Samw {"description", "<string>", smbadm_setprop_desc, 1505331Samw smbadm_getprop_desc, NULL }, 1515331Samw }; 1525331Samw 153*7052Samw static int smbadm_init(void); 154*7052Samw static void smbadm_fini(void); 1555331Samw static const char *smbadm_pwd_strerror(int error); 1565331Samw 1575331Samw /* 1585331Samw * Number of supported properties 1595331Samw */ 1605331Samw #define SMBADM_NPROP (sizeof (smbadm_ptable) / sizeof (smbadm_ptable[0])) 1615331Samw 1625331Samw static void 1635331Samw smbadm_cmdusage(FILE *fp, smbadm_cmdinfo_t *cmd) 1645331Samw { 1655331Samw switch (cmd->usage) { 1665331Samw case HELP_ADD_MEMBER: 1675331Samw (void) fprintf(fp, 1685331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 1695331Samw cmd->name); 1705331Samw return; 1715331Samw 1725331Samw case HELP_CREATE: 1735331Samw (void) fprintf(fp, gettext("\t%s [-d description] group\n"), 1745331Samw cmd->name); 1755331Samw return; 1765331Samw 1775331Samw case HELP_DELETE: 1785331Samw (void) fprintf(fp, gettext("\t%s group\n"), cmd->name); 1795331Samw return; 1805331Samw 181*7052Samw case HELP_USER_DISABLE: 182*7052Samw case HELP_USER_ENABLE: 1835331Samw (void) fprintf(fp, gettext("\t%s user\n"), cmd->name); 1845331Samw return; 1855331Samw 1865331Samw case HELP_GET: 1875331Samw (void) fprintf(fp, gettext("\t%s [[-p property] ...] group\n"), 1885331Samw cmd->name); 1895331Samw return; 1905331Samw 1915331Samw case HELP_JOIN: 1925331Samw (void) fprintf(fp, gettext("\t%s -u username domain\n" 1935331Samw "\t%s -w workgroup\n"), cmd->name, cmd->name); 1945331Samw return; 1955331Samw 1965331Samw case HELP_LIST: 1975331Samw (void) fprintf(fp, gettext("\t%s\n"), cmd->name); 1985331Samw return; 1995331Samw 2005331Samw case HELP_DEL_MEMBER: 2015331Samw (void) fprintf(fp, 2025331Samw gettext("\t%s -m member [[-m member] ...] group\n"), 2035331Samw cmd->name); 2045331Samw return; 2055331Samw 2065331Samw case HELP_RENAME: 2075331Samw (void) fprintf(fp, gettext("\t%s group new-group\n"), 2085331Samw cmd->name); 2095331Samw return; 2105331Samw 2115331Samw case HELP_SET: 2125331Samw (void) fprintf(fp, gettext("\t%s -p property=value " 2135331Samw "[[-p property=value] ...] group\n"), cmd->name); 2145331Samw return; 2155331Samw 2165331Samw case HELP_SHOW: 2175331Samw (void) fprintf(fp, gettext("\t%s [-m] [-p] [group]\n"), 2185331Samw cmd->name); 2195331Samw return; 2205331Samw 221*7052Samw default: 222*7052Samw break; 2235331Samw } 2245331Samw 2255331Samw abort(); 2265331Samw /* NOTREACHED */ 2275331Samw } 2285331Samw 2295331Samw static void 2305331Samw smbadm_usage(boolean_t requested) 2315331Samw { 2325331Samw FILE *fp = requested ? stdout : stderr; 2335331Samw boolean_t show_props = B_FALSE; 2345331Samw int i; 2355331Samw 2365331Samw if (curcmd == NULL) { 2375331Samw (void) fprintf(fp, 2385331Samw gettext("usage: %s [-h | <command> [options]]\n"), 2395331Samw progname); 2405331Samw (void) fprintf(fp, 2415331Samw gettext("where 'command' is one of the following:\n\n")); 2425331Samw 2435331Samw for (i = 0; i < SMBADM_NCMD; i++) 2445331Samw smbadm_cmdusage(fp, &smbadm_cmdtable[i]); 2455331Samw 2465331Samw (void) fprintf(fp, 2475331Samw gettext("\nFor property list, run %s %s|%s\n"), 2485331Samw progname, "get", "set"); 2495331Samw 2505331Samw exit(requested ? 0 : 2); 2515331Samw } 2525331Samw 2535331Samw (void) fprintf(fp, gettext("usage:\n")); 2545331Samw smbadm_cmdusage(fp, curcmd); 2555331Samw 2565331Samw if (strcmp(curcmd->name, "get") == 0 || 2575331Samw strcmp(curcmd->name, "set") == 0) 2585331Samw show_props = B_TRUE; 2595331Samw 2605331Samw if (show_props) { 2615331Samw (void) fprintf(fp, 2625331Samw gettext("\nThe following properties are supported:\n")); 2635331Samw 2645331Samw (void) fprintf(fp, "\n\t%-16s %s\n\n", 2655331Samw "PROPERTY", "VALUES"); 2665331Samw 2675331Samw for (i = 0; i < SMBADM_NPROP; i++) { 2685331Samw (void) fprintf(fp, "\t%-16s %s\n", 2695331Samw smbadm_ptable[i].p_name, 2705331Samw smbadm_ptable[i].p_dispvalue); 2715331Samw } 2725331Samw } 2735331Samw 2745331Samw exit(requested ? 0 : 2); 2755331Samw } 2765331Samw 2775331Samw /* 2785331Samw * smbadm_join 2795331Samw * 2805331Samw * Join the given domain/workgroup 2815331Samw */ 2825331Samw static int 2835331Samw smbadm_join(int argc, char **argv) 2845331Samw { 2855331Samw char option; 2865331Samw smb_joininfo_t jdi; 2875331Samw boolean_t join_w = B_FALSE; 2885331Samw boolean_t join_d = B_FALSE; 2895331Samw uint32_t status; 2906600Sas200622 char curdom[MAXHOSTNAMELEN]; 2915331Samw 2925331Samw bzero(&jdi, sizeof (jdi)); 2935331Samw 2945331Samw while ((option = getopt(argc, argv, "u:w:")) != -1) { 2955331Samw switch (option) { 2965331Samw case 'w': 2975331Samw (void) strlcpy(jdi.domain_name, optarg, 2985331Samw sizeof (jdi.domain_name)); 2995331Samw jdi.mode = SMB_SECMODE_WORKGRP; 3005331Samw join_w = B_TRUE; 3015331Samw break; 3025331Samw 3035331Samw case 'u': 3045331Samw /* admin username */ 3055331Samw (void) strlcpy(jdi.domain_username, optarg, 3065331Samw sizeof (jdi.domain_username)); 3075331Samw jdi.mode = SMB_SECMODE_DOMAIN; 3085331Samw join_d = B_TRUE; 3095331Samw break; 3105331Samw 3115331Samw default: 3125331Samw smbadm_usage(B_FALSE); 3135331Samw } 3145331Samw } 3155331Samw 3165331Samw if (join_w && join_d) { 3175331Samw (void) fprintf(stderr, 3185331Samw gettext("domain and workgroup " 3195331Samw "can not be specified together\n")); 3205331Samw smbadm_usage(B_FALSE); 3215331Samw } 3225331Samw 3235331Samw if (join_d && (argv[optind] != NULL)) { 3245331Samw (void) strlcpy(jdi.domain_name, argv[optind], 3255331Samw sizeof (jdi.domain_name)); 3265331Samw } 3275331Samw 3285331Samw if (*jdi.domain_name == '\0') { 3295331Samw (void) fprintf(stderr, gettext("missing %s name\n"), 3305331Samw (join_d) ? "domain" : "workgroup"); 3315331Samw smbadm_usage(B_FALSE); 3325331Samw } 3335331Samw 3345331Samw if (join_d && *jdi.domain_username == '\0') { 3355331Samw (void) fprintf(stderr, gettext("missing username\n")); 3365331Samw smbadm_usage(B_FALSE); 3375331Samw } 3385331Samw 3395331Samw if (join_w) { 3405331Samw status = smb_join(&jdi); 3415331Samw if (status == NT_STATUS_SUCCESS) { 3425331Samw (void) printf( 3435331Samw gettext("Successfully joined workgroup '%s'\n"), 3445331Samw jdi.domain_name); 3455331Samw return (0); 3465331Samw } 3475331Samw 3485331Samw (void) fprintf(stderr, 3495331Samw gettext("failed to join workgroup '%s' (%s)\n"), 3505331Samw jdi.domain_name, xlate_nt_status(status)); 3515331Samw 3525331Samw return (1); 3535331Samw } 3545331Samw 3556600Sas200622 if (smb_config_get_secmode() == SMB_SECMODE_DOMAIN) { 3566600Sas200622 (void) smb_getdomainname(curdom, MAXHOSTNAMELEN); 3576600Sas200622 if (*curdom != 0 && strncasecmp(curdom, jdi.domain_name, 3586600Sas200622 strlen(curdom))) { 3596139Sjb150015 char reply[8]; 3606139Sjb150015 3616600Sas200622 (void) printf(gettext("This system has already " 3626600Sas200622 "joined to '%s' domain.\n" 3636600Sas200622 "Would you like to join the new domain " 3646600Sas200622 "[yes/no]? "), 3656600Sas200622 curdom); 3666139Sjb150015 (void) scanf("%8s", reply); 3676139Sjb150015 (void) trim_whitespace(reply); 3686139Sjb150015 if (strncasecmp(reply, "yes", 3) != 0) 3696139Sjb150015 return (0); 3706139Sjb150015 } 3716139Sjb150015 } 3726139Sjb150015 3735331Samw /* Join the domain */ 3745331Samw if (*jdi.domain_passwd == '\0') { 3755331Samw char *p = NULL; 3765331Samw char *prompt = gettext("Enter domain password: "); 3775331Samw p = getpassphrase(prompt); 3785331Samw if (!p) { 3795331Samw (void) fprintf(stderr, gettext("missing password\n")); 3805331Samw smbadm_usage(B_FALSE); 3815331Samw } 3825331Samw 3835331Samw (void) strlcpy(jdi.domain_passwd, p, 3845331Samw sizeof (jdi.domain_passwd)); 3855331Samw } 3865331Samw 3875331Samw (void) printf(gettext("Joining '%s' ... this may take a minute ...\n"), 3885331Samw jdi.domain_name); 3895331Samw 3905331Samw status = smb_join(&jdi); 3915331Samw 3925331Samw switch (status) { 3935331Samw case NT_STATUS_SUCCESS: 3945331Samw (void) printf(gettext("Successfully joined domain '%s'\n"), 3955331Samw jdi.domain_name); 3966432Sas200622 3975331Samw return (0); 3985331Samw 3995331Samw case NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND: 4005331Samw (void) fprintf(stderr, gettext("failed to find " 4015331Samw "any domain controllers for '%s'\n"), 4025331Samw jdi.domain_name); 4035331Samw break; 4045331Samw 4055331Samw default: 4065331Samw (void) fprintf(stderr, 4075331Samw gettext("failed to join domain '%s' (%s)\n"), 4085331Samw jdi.domain_name, xlate_nt_status(status)); 4095331Samw } 4105331Samw 4115331Samw return (1); 4125331Samw } 4135331Samw 4145331Samw /* 4155331Samw * smbadm_list 4165331Samw * 4175331Samw * Displays current security mode and domain/workgroup name. 4185331Samw */ 4195331Samw /*ARGSUSED*/ 4205331Samw static int 4215331Samw smbadm_list(int argc, char **argv) 4225331Samw { 4236139Sjb150015 char domain[MAXHOSTNAMELEN]; 4246139Sjb150015 char modename[16]; 4256139Sjb150015 int rc; 4265331Samw 4276139Sjb150015 rc = smb_config_getstr(SMB_CI_SECURITY, modename, sizeof (modename)); 4286139Sjb150015 if (rc != SMBD_SMF_OK) { 4295331Samw (void) fprintf(stderr, 4305331Samw gettext("failed to get the security mode\n")); 4315331Samw return (1); 4325331Samw } 4335331Samw 4346139Sjb150015 (void) printf(gettext("security mode: %s\n"), modename); 4355331Samw 4366139Sjb150015 if (smb_getdomainname(domain, sizeof (domain)) != 0) { 4376139Sjb150015 (void) fprintf(stderr, gettext("failed to get the %s name\n"), 4386139Sjb150015 modename); 4395331Samw return (1); 4405331Samw } 4415331Samw 4426139Sjb150015 (void) printf(gettext("%s name: %s\n"), modename, domain); 4435331Samw return (0); 4445331Samw } 4455331Samw 4465331Samw /* 4475331Samw * smbadm_group_create 4485331Samw * 4495331Samw * Creates a local SMB group 4505331Samw */ 4515331Samw static int 4525331Samw smbadm_group_create(int argc, char **argv) 4535331Samw { 4545331Samw char *gname = NULL; 4555331Samw char *desc = NULL; 4565331Samw char option; 4575772Sas200622 int status; 4585331Samw 4595331Samw while ((option = getopt(argc, argv, "d:")) != -1) { 4605331Samw switch (option) { 4615331Samw case 'd': 4625331Samw desc = optarg; 4635331Samw break; 4645331Samw 4655331Samw default: 4665331Samw smbadm_usage(B_FALSE); 4675331Samw } 4685331Samw } 4695331Samw 4705331Samw gname = argv[optind]; 4715331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 4725331Samw (void) fprintf(stderr, gettext("missing group name\n")); 4735331Samw smbadm_usage(B_FALSE); 4745331Samw } 4755331Samw 4765331Samw if (getgrnam(gname) == NULL) { 4775331Samw (void) fprintf(stderr, 4785772Sas200622 gettext("failed to get the Solaris group '%s'\n"), gname); 4795331Samw (void) fprintf(stderr, 4805772Sas200622 gettext("use 'groupadd' to add '%s'\n"), gname); 4815331Samw return (1); 4825331Samw } 4835331Samw 4845772Sas200622 status = smb_lgrp_add(gname, desc); 4855772Sas200622 if (status != SMB_LGRP_SUCCESS) { 4865331Samw (void) fprintf(stderr, 4875331Samw gettext("failed to create the group (%s)\n"), 4885772Sas200622 smb_lgrp_strerror(status)); 4895331Samw } else { 4905772Sas200622 (void) printf(gettext("'%s' created.\n"), 4915331Samw gname); 4925331Samw } 4935331Samw 4945331Samw return (status); 4955331Samw } 4965331Samw 4975331Samw /* 4985331Samw * smbadm_group_dump_members 4995331Samw * 5005331Samw * Dump group members details. 5015331Samw */ 5025331Samw static void 5035772Sas200622 smbadm_group_dump_members(smb_gsid_t *members, int num) 5045331Samw { 5056432Sas200622 char sidstr[SMB_SID_STRSZ]; 5065331Samw int i; 5075331Samw 5085772Sas200622 if (num == 0) { 5095331Samw (void) printf(gettext("\tNo members\n")); 5105331Samw return; 5115331Samw } 5125331Samw 5135331Samw (void) printf(gettext("\tMembers:\n")); 5145772Sas200622 for (i = 0; i < num; i++) { 5156600Sas200622 *sidstr = '\0'; 5166600Sas200622 if (smb_lookup_sid(members[i].gs_sid, sidstr, 5176600Sas200622 sizeof (sidstr)) == NT_STATUS_SUCCESS) 5186600Sas200622 (void) printf(gettext("\t\t%s\n"), sidstr); 5196600Sas200622 else 5206600Sas200622 (void) printf(gettext("\t\tERROR! Invalid SID\n")); 5215331Samw } 5225331Samw } 5235331Samw 5245331Samw /* 5255331Samw * smbadm_group_dump_privs 5265331Samw * 5275331Samw * Dump group privilege details. 5285331Samw */ 5295331Samw static void 5305772Sas200622 smbadm_group_dump_privs(smb_privset_t *privs) 5315331Samw { 5325772Sas200622 smb_privinfo_t *pinfo; 5335772Sas200622 char *pstatus; 5345331Samw int i; 5355331Samw 5365331Samw (void) printf(gettext("\tPrivileges: \n")); 5375331Samw 5385772Sas200622 for (i = 0; i < privs->priv_cnt; i++) { 5395772Sas200622 pinfo = smb_priv_getbyvalue(privs->priv[i].luid.lo_part); 5405772Sas200622 if ((pinfo == NULL) || (pinfo->flags & PF_PRESENTABLE) == 0) 5415331Samw continue; 5425331Samw 5435772Sas200622 switch (privs->priv[i].attrs) { 5445772Sas200622 case SE_PRIVILEGE_ENABLED: 5455772Sas200622 pstatus = "On"; 5465772Sas200622 break; 5475772Sas200622 case SE_PRIVILEGE_DISABLED: 5485772Sas200622 pstatus = "Off"; 5495772Sas200622 break; 5505772Sas200622 default: 5515772Sas200622 pstatus = "Unknown"; 5525772Sas200622 break; 5535331Samw } 5545772Sas200622 (void) printf(gettext("\t\t%s: %s\n"), pinfo->name, pstatus); 5555331Samw } 5565331Samw 5575772Sas200622 if (privs->priv_cnt == 0) 5585331Samw (void) printf(gettext("\t\tNo privileges\n")); 5595331Samw } 5605331Samw 5615331Samw /* 5625331Samw * smbadm_group_dump 5635331Samw * 5645331Samw * Dump group details. 5655331Samw */ 5665772Sas200622 static void 5675772Sas200622 smbadm_group_dump(smb_group_t *grp, boolean_t show_mem, boolean_t show_privs) 5685331Samw { 5696432Sas200622 char sidstr[SMB_SID_STRSZ]; 5705331Samw 5715772Sas200622 (void) printf(gettext("%s (%s)\n"), grp->sg_name, grp->sg_cmnt); 5725331Samw 5736432Sas200622 smb_sid_tostr(grp->sg_id.gs_sid, sidstr); 5745772Sas200622 (void) printf(gettext("\tSID: %s\n"), sidstr); 5755331Samw 5765772Sas200622 if (show_privs) 5775772Sas200622 smbadm_group_dump_privs(grp->sg_privs); 5785331Samw 5795772Sas200622 if (show_mem) 5805772Sas200622 smbadm_group_dump_members(grp->sg_members, grp->sg_nmembers); 5815331Samw } 5825331Samw 5835331Samw /* 5845331Samw * smbadm_group_show 5855331Samw * 5865331Samw */ 5875331Samw static int 5885331Samw smbadm_group_show(int argc, char **argv) 5895331Samw { 5905331Samw char *gname = NULL; 5915331Samw boolean_t show_privs; 5925331Samw boolean_t show_members; 5935331Samw char option; 5945772Sas200622 int status; 5955772Sas200622 smb_group_t grp; 5965772Sas200622 smb_giter_t gi; 5975331Samw 5985331Samw show_privs = show_members = B_FALSE; 5995331Samw 6005331Samw while ((option = getopt(argc, argv, "mp")) != -1) { 6015331Samw switch (option) { 6025331Samw case 'm': 6035331Samw show_members = B_TRUE; 6045331Samw break; 6055331Samw case 'p': 6065331Samw show_privs = B_TRUE; 6075331Samw break; 6085331Samw 6095331Samw default: 6105331Samw smbadm_usage(B_FALSE); 6115331Samw } 6125331Samw } 6135331Samw 6145331Samw gname = argv[optind]; 6155331Samw if (optind >= argc || gname == NULL || *gname == '\0') 6165331Samw gname = "*"; 6175331Samw 6185772Sas200622 if (strcmp(gname, "*")) { 6195772Sas200622 status = smb_lgrp_getbyname(gname, &grp); 6205772Sas200622 if (status == SMB_LGRP_SUCCESS) { 6215772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 6225772Sas200622 smb_lgrp_free(&grp); 6235772Sas200622 } else { 6245772Sas200622 (void) fprintf(stderr, 6255772Sas200622 gettext("failed to find '%s' (%s)\n"), 6265772Sas200622 gname, smb_lgrp_strerror(status)); 6275772Sas200622 } 6285772Sas200622 return (status); 6295331Samw } 6305331Samw 6316432Sas200622 if ((status = smb_lgrp_iteropen(&gi)) != SMB_LGRP_SUCCESS) { 6325772Sas200622 (void) fprintf(stderr, 6335772Sas200622 gettext("failed to list groups (%s)\n"), 6345772Sas200622 smb_lgrp_strerror(status)); 6355772Sas200622 return (status); 6365331Samw } 6375331Samw 6386432Sas200622 while ((status = smb_lgrp_iterate(&gi, &grp)) == SMB_LGRP_SUCCESS) { 6395772Sas200622 smbadm_group_dump(&grp, show_members, show_privs); 6405772Sas200622 smb_lgrp_free(&grp); 6415772Sas200622 } 6426432Sas200622 6435772Sas200622 smb_lgrp_iterclose(&gi); 6445772Sas200622 6456432Sas200622 if (status != SMB_LGRP_NO_MORE) { 6466432Sas200622 (void) fprintf(stderr, 6476432Sas200622 gettext("failed to get all the groups (%s)\n"), 6486432Sas200622 smb_lgrp_strerror(status)); 6496432Sas200622 return (status); 6506432Sas200622 } 6516432Sas200622 6525772Sas200622 return (0); 6535331Samw } 6545331Samw 6555331Samw /* 6565331Samw * smbadm_group_delete 6575331Samw */ 6585331Samw static int 6595331Samw smbadm_group_delete(int argc, char **argv) 6605331Samw { 6615331Samw char *gname = NULL; 6625772Sas200622 int status; 6635331Samw 6645331Samw gname = argv[optind]; 6655331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 6665331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6675331Samw smbadm_usage(B_FALSE); 6685331Samw } 6695331Samw 6705772Sas200622 status = smb_lgrp_delete(gname); 6715772Sas200622 if (status != SMB_LGRP_SUCCESS) { 6725331Samw (void) fprintf(stderr, 6735331Samw gettext("failed to delete the group (%s)\n"), 6745772Sas200622 smb_lgrp_strerror(status)); 6755331Samw } else { 6765772Sas200622 (void) printf(gettext("'%s' deleted.\n"), 6775331Samw gname); 6785331Samw } 6795331Samw 6805331Samw return (status); 6815331Samw } 6825331Samw 6835331Samw /* 6845331Samw * smbadm_group_rename 6855331Samw */ 6865331Samw static int 6875331Samw smbadm_group_rename(int argc, char **argv) 6885331Samw { 6895331Samw char *gname = NULL; 6905331Samw char *ngname = NULL; 6915772Sas200622 int status; 6925331Samw 6935331Samw gname = argv[optind]; 6945331Samw if (optind++ >= argc || gname == NULL || *gname == '\0') { 6955331Samw (void) fprintf(stderr, gettext("missing group name\n")); 6965331Samw smbadm_usage(B_FALSE); 6975331Samw } 6985331Samw 6995331Samw ngname = argv[optind]; 7005331Samw if (optind >= argc || ngname == NULL || *ngname == '\0') { 7015331Samw (void) fprintf(stderr, gettext("missing new group name\n")); 7025331Samw smbadm_usage(B_FALSE); 7035331Samw } 7045331Samw 7055772Sas200622 if (getgrnam(ngname) == NULL) { 7065331Samw (void) fprintf(stderr, 7075772Sas200622 gettext("failed to get the Solaris group '%s'\n"), ngname); 7085331Samw (void) fprintf(stderr, 7095772Sas200622 gettext("use 'groupadd' to add '%s'\n"), ngname); 7105331Samw return (1); 7115331Samw } 7125331Samw 7135772Sas200622 status = smb_lgrp_rename(gname, ngname); 7145772Sas200622 if (status != SMB_LGRP_SUCCESS) { 7155772Sas200622 if (status == SMB_LGRP_EXISTS) 7165772Sas200622 (void) fprintf(stderr, 7175772Sas200622 gettext("failed to rename '%s' (%s already " 7185772Sas200622 "exists)\n"), gname, ngname); 7195772Sas200622 else 7205772Sas200622 (void) fprintf(stderr, 7215772Sas200622 gettext("failed to rename '%s' (%s)\n"), gname, 7225772Sas200622 smb_lgrp_strerror(status)); 7235331Samw } else { 7245772Sas200622 (void) printf(gettext("'%s' renamed to '%s'\n"), gname, ngname); 7255331Samw } 7265331Samw 7275331Samw return (status); 7285331Samw } 7295331Samw 7305331Samw /* 7315331Samw * smbadm_group_setprop 7325331Samw * 7335331Samw * Set the group properties. 7345331Samw */ 7355331Samw static int 7365331Samw smbadm_group_setprop(int argc, char **argv) 7375331Samw { 7385331Samw char *gname = NULL; 7395331Samw smbadm_prop_t props[SMBADM_NPROP]; 7405331Samw smbadm_prop_handle_t *phandle; 7415331Samw char option; 7425331Samw int pcnt = 0; 7435331Samw int ret; 7445331Samw int p; 7455331Samw 7465331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 7475331Samw 7485331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 7495331Samw switch (option) { 7505331Samw case 'p': 7515331Samw if (pcnt >= SMBADM_NPROP) { 7525331Samw (void) fprintf(stderr, 7535331Samw gettext("exceeded number of supported" 7545331Samw " properties\n")); 7555331Samw smbadm_usage(B_FALSE); 7565331Samw } 7575331Samw 7585772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 7595772Sas200622 smbadm_usage(B_FALSE); 7605331Samw break; 7615331Samw 7625331Samw default: 7635331Samw smbadm_usage(B_FALSE); 7645331Samw } 7655331Samw } 7665331Samw 7675331Samw if (pcnt == 0) { 7685331Samw (void) fprintf(stderr, 7695331Samw gettext("missing property=value argument\n")); 7705331Samw smbadm_usage(B_FALSE); 7715331Samw } 7725331Samw 7735331Samw gname = argv[optind]; 7745331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 7755331Samw (void) fprintf(stderr, gettext("missing group name\n")); 7765331Samw smbadm_usage(B_FALSE); 7775331Samw } 7785331Samw 7795331Samw for (p = 0; p < pcnt; p++) { 7805331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 7815331Samw if (phandle) { 7825331Samw if (phandle->p_setfn(gname, &props[p]) != 0) 7835331Samw ret = 1; 7845331Samw } 7855331Samw } 7865331Samw 7875331Samw return (ret); 7885331Samw } 7895331Samw 7905331Samw /* 7915331Samw * smbadm_group_getprop 7925331Samw * 7935331Samw * Get the group properties. 7945331Samw */ 7955331Samw static int 7965331Samw smbadm_group_getprop(int argc, char **argv) 7975331Samw { 7985331Samw char *gname = NULL; 7995331Samw smbadm_prop_t props[SMBADM_NPROP]; 8005331Samw smbadm_prop_handle_t *phandle; 8015331Samw char option; 8025331Samw int pcnt = 0; 8035331Samw int ret; 8045331Samw int p; 8055331Samw 8065331Samw bzero(props, SMBADM_NPROP * sizeof (smbadm_prop_t)); 8075331Samw 8085331Samw while ((option = getopt(argc, argv, "p:")) != -1) { 8095331Samw switch (option) { 8105331Samw case 'p': 8115331Samw if (pcnt >= SMBADM_NPROP) { 8125331Samw (void) fprintf(stderr, 8135331Samw gettext("exceeded number of supported" 8145331Samw " properties\n")); 8155331Samw smbadm_usage(B_FALSE); 8165331Samw } 8175331Samw 8185772Sas200622 if (smbadm_prop_parse(optarg, &props[pcnt++]) != 0) 8195772Sas200622 smbadm_usage(B_FALSE); 8205331Samw break; 8215331Samw 8225331Samw default: 8235331Samw smbadm_usage(B_FALSE); 8245331Samw } 8255331Samw } 8265331Samw 8275331Samw gname = argv[optind]; 8285331Samw if (optind >= argc || gname == NULL || *gname == '\0') { 8295331Samw (void) fprintf(stderr, gettext("missing group name\n")); 8305331Samw smbadm_usage(B_FALSE); 8315331Samw } 8325331Samw 8335331Samw if (pcnt == 0) { 8345331Samw /* 8355331Samw * If no property has be specified then get 8365331Samw * all the properties. 8375331Samw */ 8385331Samw pcnt = SMBADM_NPROP; 8395331Samw for (p = 0; p < pcnt; p++) 8405331Samw props[p].p_name = smbadm_ptable[p].p_name; 8415331Samw } 8425331Samw 8435331Samw for (p = 0; p < pcnt; p++) { 8445331Samw phandle = smbadm_prop_gethandle(props[p].p_name); 8455331Samw if (phandle) { 8465331Samw if (phandle->p_getfn(gname, &props[p]) != 0) 8475331Samw ret = 1; 8485331Samw } 8495331Samw } 8505331Samw 8515331Samw return (ret); 8525331Samw } 8535331Samw 8545331Samw /* 8555331Samw * smbadm_group_addmember 8565331Samw * 8575331Samw */ 8585331Samw static int 8595331Samw smbadm_group_addmember(int argc, char **argv) 8605331Samw { 8615331Samw char *gname = NULL; 8625331Samw char **mname; 8635331Samw char option; 8645772Sas200622 smb_gsid_t msid; 8655772Sas200622 int status; 8665331Samw int mcnt = 0; 8675331Samw int ret = 0; 8685331Samw int i; 8695331Samw 8705331Samw 8715331Samw mname = (char **)malloc(argc * sizeof (char *)); 8725331Samw if (mname == NULL) { 8735331Samw (void) fprintf(stderr, gettext("out of memory\n")); 8745331Samw return (1); 8755331Samw } 8765331Samw bzero(mname, argc * sizeof (char *)); 8775331Samw 8785331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 8795331Samw switch (option) { 8805331Samw case 'm': 8815331Samw mname[mcnt++] = optarg; 8825331Samw break; 8835331Samw 8845331Samw default: 8855331Samw free(mname); 8865331Samw smbadm_usage(B_FALSE); 8875331Samw } 8885331Samw } 8895331Samw 8905331Samw if (mcnt == 0) { 8915331Samw (void) fprintf(stderr, gettext("missing member name\n")); 8925331Samw free(mname); 8935331Samw smbadm_usage(B_FALSE); 8945331Samw } 8955331Samw 8965331Samw gname = argv[optind]; 8975331Samw if (optind >= argc || gname == NULL || *gname == 0) { 8985331Samw (void) fprintf(stderr, gettext("missing group name\n")); 8995331Samw free(mname); 9005331Samw smbadm_usage(B_FALSE); 9015331Samw } 9025331Samw 9035331Samw 9045331Samw for (i = 0; i < mcnt; i++) { 9055331Samw if (mname[i] == NULL) 9065331Samw continue; 9075331Samw 9085772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 9095772Sas200622 (void) fprintf(stderr, 9105772Sas200622 gettext("failed to add %s " 9115772Sas200622 "(could not obtain the SID)\n"), 9125772Sas200622 mname[i]); 9135772Sas200622 continue; 9145772Sas200622 } 9155772Sas200622 9165772Sas200622 status = smb_lgrp_add_member(gname, msid.gs_sid, msid.gs_type); 9175772Sas200622 free(msid.gs_sid); 9185772Sas200622 if (status != SMB_LGRP_SUCCESS) { 9195331Samw (void) fprintf(stderr, 9205331Samw gettext("failed to add %s (%s)\n"), 9215772Sas200622 mname[i], smb_lgrp_strerror(status)); 9225331Samw ret = 1; 9235772Sas200622 } else { 9245772Sas200622 (void) printf(gettext("'%s' is now a member of '%s'\n"), 9255772Sas200622 mname[i], gname); 9265331Samw } 9275331Samw } 9285331Samw 9295331Samw free(mname); 9305331Samw return (ret); 9315331Samw } 9325331Samw 9335331Samw /* 9345331Samw * smbadm_group_delmember 9355331Samw */ 9365331Samw static int 9375331Samw smbadm_group_delmember(int argc, char **argv) 9385331Samw { 9395331Samw char *gname = NULL; 9405331Samw char **mname; 9415331Samw char option; 9425772Sas200622 smb_gsid_t msid; 9435772Sas200622 int status; 9445331Samw int mcnt = 0; 9455331Samw int ret = 0; 9465331Samw int i; 9475331Samw 9485331Samw mname = (char **)malloc(argc * sizeof (char *)); 9495331Samw if (mname == NULL) { 9505331Samw (void) fprintf(stderr, gettext("out of memory\n")); 9515331Samw return (1); 9525331Samw } 9535331Samw bzero(mname, argc * sizeof (char *)); 9545331Samw 9555331Samw while ((option = getopt(argc, argv, "m:")) != -1) { 9565331Samw switch (option) { 9575331Samw case 'm': 9585331Samw mname[mcnt++] = optarg; 9595331Samw break; 9605331Samw 9615331Samw default: 9625331Samw free(mname); 9635331Samw smbadm_usage(B_FALSE); 9645331Samw } 9655331Samw } 9665331Samw 9675331Samw if (mcnt == 0) { 9685331Samw (void) fprintf(stderr, gettext("missing member name\n")); 9695331Samw free(mname); 9705331Samw smbadm_usage(B_FALSE); 9715331Samw } 9725331Samw 9735331Samw gname = argv[optind]; 9745331Samw if (optind >= argc || gname == NULL || *gname == 0) { 9755331Samw (void) fprintf(stderr, gettext("missing group name\n")); 9765331Samw free(mname); 9775331Samw smbadm_usage(B_FALSE); 9785331Samw } 9795331Samw 9805331Samw 9815331Samw for (i = 0; i < mcnt; i++) { 9825331Samw if (mname[i] == NULL) 9835331Samw continue; 9845331Samw 9855772Sas200622 if (smb_lookup_name(mname[i], &msid) != NT_STATUS_SUCCESS) { 9865772Sas200622 (void) fprintf(stderr, 9875772Sas200622 gettext("failed to remove %s " 9885772Sas200622 "(could not obtain the SID)\n"), 9895772Sas200622 mname[i]); 9905772Sas200622 continue; 9915772Sas200622 } 9925772Sas200622 9935772Sas200622 status = smb_lgrp_del_member(gname, msid.gs_sid, msid.gs_type); 9945772Sas200622 free(msid.gs_sid); 9955772Sas200622 if (status != SMB_LGRP_SUCCESS) { 9965331Samw (void) fprintf(stderr, 9975331Samw gettext("failed to remove %s (%s)\n"), 9985772Sas200622 mname[i], smb_lgrp_strerror(status)); 9995331Samw ret = 1; 10005331Samw } else { 10015331Samw (void) printf( 10025772Sas200622 gettext("'%s' has been removed from %s\n"), 10035331Samw mname[i], gname); 10045331Samw } 10055331Samw } 10065331Samw 10075331Samw return (ret); 10085331Samw } 10095331Samw 10105331Samw static int 10115331Samw smbadm_user_disable(int argc, char **argv) 10125331Samw { 10135331Samw int error; 10145331Samw char *user = NULL; 10155331Samw 10165331Samw user = argv[optind]; 10175331Samw if (optind >= argc || user == NULL || *user == '\0') { 10185331Samw (void) fprintf(stderr, gettext("missing user name\n")); 10195331Samw smbadm_usage(B_FALSE); 10205331Samw } 10215331Samw 10225331Samw error = smb_pwd_setcntl(user, SMB_PWC_DISABLE); 10235331Samw if (error == SMB_PWE_SUCCESS) 10245331Samw (void) printf(gettext("%s is disabled.\n"), user); 10255331Samw else 10265331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 10275331Samw 10285331Samw return (error); 10295331Samw } 10305331Samw 10315331Samw static int 10325331Samw smbadm_user_enable(int argc, char **argv) 10335331Samw { 10345331Samw int error; 10355331Samw char *user = NULL; 10365331Samw 10375331Samw user = argv[optind]; 10385331Samw if (optind >= argc || user == NULL || *user == '\0') { 10395331Samw (void) fprintf(stderr, gettext("missing user name\n")); 10405331Samw smbadm_usage(B_FALSE); 10415331Samw } 10425331Samw 10435331Samw error = smb_pwd_setcntl(user, SMB_PWC_ENABLE); 10445331Samw if (error == SMB_PWE_SUCCESS) 10455331Samw (void) printf(gettext("%s is enabled.\n"), user); 10465331Samw else 10475331Samw (void) fprintf(stderr, "%s\n", smbadm_pwd_strerror(error)); 10485331Samw 10495331Samw return (error); 10505331Samw } 10515331Samw 10525331Samw 10535331Samw int 10545331Samw main(int argc, char **argv) 10555331Samw { 10565772Sas200622 int ret; 10575331Samw int i; 10585331Samw 10595331Samw (void) malloc(0); /* satisfy libumem dependency */ 10605331Samw 10615331Samw progname = basename(argv[0]); 10625331Samw 10635331Samw if (getzoneid() != GLOBAL_ZONEID) { 10645331Samw (void) fprintf(stderr, 10655331Samw gettext("cannot execute in non-global zone\n")); 10665331Samw return (0); 10675331Samw } 10685331Samw 10695331Samw if (is_system_labeled()) { 10705331Samw (void) fprintf(stderr, 10715331Samw gettext("Trusted Extensions not supported\n")); 10725331Samw return (0); 10735331Samw } 10745331Samw 10755331Samw if (argc < 2) { 10765331Samw (void) fprintf(stderr, gettext("missing command\n")); 10775331Samw smbadm_usage(B_FALSE); 10785331Samw } 10795331Samw 10805331Samw /* 10815331Samw * Special case "cmd --help/-?" 10825331Samw */ 10835331Samw if (strcmp(argv[1], "-?") == 0 || 10845331Samw strcmp(argv[1], "--help") == 0 || 10855331Samw strcmp(argv[1], "-h") == 0) 10865331Samw smbadm_usage(B_TRUE); 10875331Samw 10885331Samw for (i = 0; i < SMBADM_NCMD; ++i) { 10895331Samw curcmd = &smbadm_cmdtable[i]; 10905331Samw if (strcasecmp(argv[1], curcmd->name) == 0) { 10915331Samw if (argc > 2) { 10925331Samw /* cmd subcmd --help/-? */ 10935331Samw if (strcmp(argv[2], "-?") == 0 || 10945331Samw strcmp(argv[2], "--help") == 0 || 10955331Samw strcmp(argv[2], "-h") == 0) 10965331Samw smbadm_usage(B_TRUE); 10975331Samw } 10985331Samw 1099*7052Samw if ((ret = smbadm_init()) != 0) 11006139Sjb150015 return (ret); 11015772Sas200622 11025772Sas200622 ret = curcmd->func(argc - 1, &argv[1]); 11036139Sjb150015 1104*7052Samw smbadm_fini(); 11055772Sas200622 return (ret); 11065331Samw } 11075331Samw } 11085331Samw 11095331Samw curcmd = NULL; 11105331Samw (void) fprintf(stderr, gettext("unknown subcommand (%s)\n"), argv[1]); 11115331Samw smbadm_usage(B_FALSE); 11125331Samw return (2); 11135331Samw } 11145331Samw 11156139Sjb150015 static int 1116*7052Samw smbadm_init(void) 11176139Sjb150015 { 11186139Sjb150015 int rc; 11196139Sjb150015 1120*7052Samw switch (curcmd->flags & SMBADM_CMDF_TYPEMASK) { 1121*7052Samw case SMBADM_CMDF_GROUP: 11226139Sjb150015 if (smb_idmap_start() != 0) { 11236139Sjb150015 (void) fprintf(stderr, 11246139Sjb150015 gettext("failed to contact idmap service\n")); 11256139Sjb150015 return (1); 11266139Sjb150015 } 11276139Sjb150015 11286139Sjb150015 if ((rc = smb_lgrp_start()) != SMB_LGRP_SUCCESS) { 11296139Sjb150015 (void) fprintf(stderr, 11306139Sjb150015 gettext("failed to initialize (%s)\n"), 11316139Sjb150015 smb_lgrp_strerror(rc)); 11326139Sjb150015 smb_idmap_stop(); 11336139Sjb150015 return (1); 11346139Sjb150015 } 1135*7052Samw break; 1136*7052Samw 1137*7052Samw case SMBADM_CMDF_USER: 1138*7052Samw smb_pwd_init(B_FALSE); 1139*7052Samw break; 1140*7052Samw 1141*7052Samw default: 1142*7052Samw break; 11436139Sjb150015 } 11446139Sjb150015 11456139Sjb150015 return (0); 11466139Sjb150015 } 11476139Sjb150015 11486139Sjb150015 static void 1149*7052Samw smbadm_fini(void) 11506139Sjb150015 { 1151*7052Samw switch (curcmd->flags & SMBADM_CMDF_TYPEMASK) { 1152*7052Samw case SMBADM_CMDF_GROUP: 11536139Sjb150015 smb_lgrp_stop(); 11546139Sjb150015 smb_idmap_stop(); 1155*7052Samw break; 1156*7052Samw 1157*7052Samw case SMBADM_CMDF_USER: 1158*7052Samw smb_pwd_fini(); 1159*7052Samw break; 1160*7052Samw 1161*7052Samw default: 1162*7052Samw break; 11636139Sjb150015 } 11646139Sjb150015 } 11656139Sjb150015 11665331Samw static boolean_t 11675331Samw smbadm_prop_validate(smbadm_prop_t *prop, boolean_t chkval) 11685331Samw { 11695331Samw smbadm_prop_handle_t *pinfo; 11705331Samw int i; 11715331Samw 11725331Samw for (i = 0; i < SMBADM_NPROP; i++) { 11735331Samw pinfo = &smbadm_ptable[i]; 11745331Samw if (strcmp(pinfo->p_name, prop->p_name) == 0) { 11755331Samw if (pinfo->p_chkfn && chkval) 11765331Samw return (pinfo->p_chkfn(prop)); 11775331Samw 11785331Samw return (B_TRUE); 11795331Samw } 11805331Samw } 11815331Samw 11825331Samw (void) fprintf(stderr, 11835331Samw gettext("unrecognized property '%s'\n"), prop->p_name); 11845331Samw 11855331Samw return (B_FALSE); 11865331Samw } 11875331Samw 11885331Samw static int 11895331Samw smbadm_prop_parse(char *arg, smbadm_prop_t *prop) 11905331Samw { 11915331Samw boolean_t parse_value; 11925331Samw char *equal; 11935331Samw 11945331Samw if (arg == NULL) 11955331Samw return (2); 11965331Samw 11975331Samw prop->p_name = prop->p_value = NULL; 11985331Samw 11995331Samw if (strcmp(curcmd->name, "set") == 0) 12005331Samw parse_value = B_TRUE; 12015331Samw else 12025331Samw parse_value = B_FALSE; 12035331Samw 12045331Samw prop->p_name = arg; 12055331Samw 12065331Samw if (parse_value) { 12075331Samw equal = strchr(arg, '='); 12085331Samw if (equal == NULL) 12095331Samw return (2); 12105331Samw 12115331Samw *equal++ = '\0'; 12125331Samw prop->p_value = equal; 12135331Samw } 12145331Samw 12155331Samw if (smbadm_prop_validate(prop, parse_value) == B_FALSE) 12165331Samw return (2); 12175331Samw 12185331Samw return (0); 12195331Samw } 12205331Samw 12215331Samw static smbadm_prop_handle_t * 12225331Samw smbadm_prop_gethandle(char *pname) 12235331Samw { 12245331Samw int i; 12255331Samw 12265331Samw for (i = 0; i < SMBADM_NPROP; i++) 12275331Samw if (strcmp(pname, smbadm_ptable[i].p_name) == 0) 12285331Samw return (&smbadm_ptable[i]); 12295331Samw 12305331Samw return (NULL); 12315331Samw } 12325331Samw 12335331Samw static int 12345331Samw smbadm_setprop_desc(char *gname, smbadm_prop_t *prop) 12355331Samw { 12365772Sas200622 int status; 12375331Samw 12385772Sas200622 status = smb_lgrp_setcmnt(gname, prop->p_value); 12395772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12405331Samw (void) fprintf(stderr, 12415331Samw gettext("failed to modify the group description (%s)\n"), 12425772Sas200622 smb_lgrp_strerror(status)); 12435331Samw return (1); 12445331Samw } 12455331Samw 12465331Samw (void) printf(gettext("Successfully modified " 12475331Samw "'%s' description\n"), gname); 12485331Samw 12495331Samw return (0); 12505331Samw } 12515331Samw 12525331Samw static int 12535331Samw smbadm_getprop_desc(char *gname, smbadm_prop_t *prop) 12545331Samw { 12555772Sas200622 char *cmnt = NULL; 12565772Sas200622 int status; 12575331Samw 12585772Sas200622 status = smb_lgrp_getcmnt(gname, &cmnt); 12595772Sas200622 if (status != SMB_LGRP_SUCCESS) { 12605331Samw (void) fprintf(stderr, 12615772Sas200622 gettext("failed to get the group description (%s)\n"), 12625772Sas200622 smb_lgrp_strerror(status)); 12635331Samw return (1); 12645331Samw } 12655331Samw 12665772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, cmnt); 12675772Sas200622 free(cmnt); 12685331Samw return (0); 12695331Samw } 12705331Samw 12715331Samw static int 12725772Sas200622 smbadm_group_setpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 12735331Samw { 12745772Sas200622 boolean_t enable; 12755772Sas200622 int status; 12765331Samw int ret; 12775331Samw 12785331Samw if (strcasecmp(prop->p_value, "on") == 0) { 12795331Samw (void) printf(gettext("Enabling %s privilege "), prop->p_name); 12805772Sas200622 enable = B_TRUE; 12815331Samw } else { 12825331Samw (void) printf(gettext("Disabling %s privilege "), prop->p_name); 12835772Sas200622 enable = B_FALSE; 12845331Samw } 12855331Samw 12865772Sas200622 status = smb_lgrp_setpriv(gname, priv_id, enable); 12875772Sas200622 if (status == SMB_LGRP_SUCCESS) { 12885331Samw (void) printf(gettext("succeeded\n")); 12895331Samw ret = 0; 12905331Samw } else { 12915772Sas200622 (void) printf(gettext("failed: %s\n"), 12925772Sas200622 smb_lgrp_strerror(status)); 12935331Samw ret = 1; 12945331Samw } 12955331Samw 12965331Samw return (ret); 12975331Samw } 12985331Samw 12995331Samw static int 13005772Sas200622 smbadm_group_getpriv(char *gname, uint8_t priv_id, smbadm_prop_t *prop) 13015331Samw { 13025772Sas200622 boolean_t enable; 13035772Sas200622 int status; 13045331Samw 13055772Sas200622 status = smb_lgrp_getpriv(gname, priv_id, &enable); 13065772Sas200622 if (status != SMB_LGRP_SUCCESS) { 13075331Samw (void) fprintf(stderr, gettext("failed to get %s (%s)\n"), 13085772Sas200622 prop->p_name, smb_lgrp_strerror(status)); 13095331Samw return (1); 13105331Samw } 13115331Samw 13125772Sas200622 (void) printf(gettext("\t%s: %s\n"), prop->p_name, 13135772Sas200622 (enable) ? "On" : "Off"); 13145331Samw 13155331Samw return (0); 13165331Samw } 13175331Samw 13185331Samw static int 13195331Samw smbadm_setprop_tkowner(char *gname, smbadm_prop_t *prop) 13205331Samw { 13215331Samw return (smbadm_group_setpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 13225331Samw } 13235331Samw 13245331Samw static int 13255331Samw smbadm_getprop_tkowner(char *gname, smbadm_prop_t *prop) 13265331Samw { 13275331Samw return (smbadm_group_getpriv(gname, SE_TAKE_OWNERSHIP_LUID, prop)); 13285331Samw } 13295331Samw 13305331Samw static int 13315331Samw smbadm_setprop_backup(char *gname, smbadm_prop_t *prop) 13325331Samw { 13335331Samw return (smbadm_group_setpriv(gname, SE_BACKUP_LUID, prop)); 13345331Samw } 13355331Samw 13365331Samw static int 13375331Samw smbadm_getprop_backup(char *gname, smbadm_prop_t *prop) 13385331Samw { 13395331Samw return (smbadm_group_getpriv(gname, SE_BACKUP_LUID, prop)); 13405331Samw } 13415331Samw 13425331Samw static int 13435331Samw smbadm_setprop_restore(char *gname, smbadm_prop_t *prop) 13445331Samw { 13455331Samw return (smbadm_group_setpriv(gname, SE_RESTORE_LUID, prop)); 13465331Samw } 13475331Samw 13485331Samw static int 13495331Samw smbadm_getprop_restore(char *gname, smbadm_prop_t *prop) 13505331Samw { 13515331Samw return (smbadm_group_getpriv(gname, SE_RESTORE_LUID, prop)); 13525331Samw } 13535331Samw 13545331Samw static boolean_t 13555331Samw smbadm_chkprop_priv(smbadm_prop_t *prop) 13565331Samw { 13575331Samw if (prop->p_value == NULL || *prop->p_value == '\0') { 13585331Samw (void) fprintf(stderr, 13595331Samw gettext("missing value for '%s'\n"), prop->p_name); 13605331Samw return (B_FALSE); 13615331Samw } 13625331Samw 13635331Samw if (strcasecmp(prop->p_value, "on") == 0) 13645331Samw return (B_TRUE); 13655331Samw 13665331Samw if (strcasecmp(prop->p_value, "off") == 0) 13675331Samw return (B_TRUE); 13685331Samw 13695331Samw (void) fprintf(stderr, 13705331Samw gettext("%s: unrecognized value for '%s' property\n"), 13715331Samw prop->p_value, prop->p_name); 13725331Samw 13735331Samw return (B_FALSE); 13745331Samw } 13755331Samw 13765331Samw static const char * 13775331Samw smbadm_pwd_strerror(int error) 13785331Samw { 13795331Samw switch (error) { 13805331Samw case SMB_PWE_SUCCESS: 13815331Samw return (gettext("Success.")); 13825331Samw 13835331Samw case SMB_PWE_USER_UNKNOWN: 13845331Samw return (gettext("User does not exist.")); 13855331Samw 13865331Samw case SMB_PWE_USER_DISABLE: 13875331Samw return (gettext("User is disable.")); 13885331Samw 13895331Samw case SMB_PWE_CLOSE_FAILED: 13905331Samw case SMB_PWE_OPEN_FAILED: 13915331Samw case SMB_PWE_WRITE_FAILED: 13925331Samw case SMB_PWE_UPDATE_FAILED: 13935331Samw return (gettext("Unexpected failure. " 13945331Samw "SMB password database unchanged.")); 13955331Samw 13965331Samw case SMB_PWE_STAT_FAILED: 13975331Samw return (gettext("stat of SMB password file failed.")); 13985331Samw 13995331Samw case SMB_PWE_BUSY: 14005331Samw return (gettext("SMB password database busy. " 14015331Samw "Try again later.")); 14025331Samw 14035331Samw case SMB_PWE_DENIED: 14045331Samw return (gettext("Operation not permitted.")); 14055331Samw 14065331Samw case SMB_PWE_SYSTEM_ERROR: 14075331Samw return (gettext("System error.")); 1408*7052Samw 1409*7052Samw default: 1410*7052Samw break; 14115331Samw } 14125331Samw 14135331Samw return (gettext("Unknown error code.")); 14145331Samw } 14155331Samw 14165331Samw /* 14175331Samw * Enable libumem debugging by default on DEBUG builds. 14185331Samw */ 14195331Samw #ifdef DEBUG 14205331Samw const char * 14215331Samw _umem_debug_init(void) 14225331Samw { 14235331Samw return ("default,verbose"); /* $UMEM_DEBUG setting */ 14245331Samw } 14255331Samw 14265331Samw const char * 14275331Samw _umem_logging_init(void) 14285331Samw { 14295331Samw return ("fail,contents"); /* $UMEM_LOGGING setting */ 14305331Samw } 14315331Samw #endif 1432