diff options
Diffstat (limited to 'source3/utils/sharesec.c')
-rw-r--r-- | source3/utils/sharesec.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/source3/utils/sharesec.c b/source3/utils/sharesec.c index b87a27ef86..ae2a9adf64 100644 --- a/source3/utils/sharesec.c +++ b/source3/utils/sharesec.c @@ -30,6 +30,7 @@ enum acl_mode { SMB_ACL_DELETE, SMB_ACL_MODIFY, SMB_ACL_ADD, SMB_ACL_SET, + SMB_SD_DELETE, SMB_ACL_VIEW }; struct perm_value { @@ -410,14 +411,16 @@ static int change_share_sec(TALLOC_CTX *mem_ctx, const char *sharename, char *th size_t sd_size = 0; uint32 i, j; - if (mode != SMB_ACL_SET) { + if (mode != SMB_ACL_SET && mode != SMB_SD_DELETE) { if (!(old = get_share_security( mem_ctx, sharename, &sd_size )) ) { - fprintf(stderr, "Unable to retrieve permissions for share [%s]\n", sharename); + fprintf(stderr, "Unable to retrieve permissions for share " + "[%s]\n", sharename); return -1; } } - if ( (mode != SMB_ACL_VIEW) && !(sd = parse_acl_string(mem_ctx, the_acl, &sd_size )) ) { + if ( (mode != SMB_ACL_VIEW && mode != SMB_SD_DELETE) && + !(sd = parse_acl_string(mem_ctx, the_acl, &sd_size )) ) { fprintf( stderr, "Failed to parse acl\n"); return -1; } @@ -448,7 +451,6 @@ static int change_share_sec(TALLOC_CTX *mem_ctx, const char *sharename, char *th printf(" not found\n"); } } - break; case SMB_ACL_MODIFY: for (i=0;sd->dacl && i<sd->dacl->num_aces;i++) { @@ -484,6 +486,13 @@ static int change_share_sec(TALLOC_CTX *mem_ctx, const char *sharename, char *th case SMB_ACL_SET: old = sd; break; + case SMB_SD_DELETE: + if (!delete_share_security(sharename)) { + fprintf( stderr, "Failed to delete security descriptor for " + "share [%s]\n", sharename ); + return -1; + } + return 0; } /* Denied ACE entries must come before allowed ones */ @@ -513,10 +522,11 @@ int main(int argc, const char *argv[]) bool initialize_sid = False; struct poptOption long_options[] = { POPT_AUTOHELP - { "remove", 'r', POPT_ARG_STRING, &the_acl, 'r', "Delete an ACE", "ACL" }, - { "modify", 'm', POPT_ARG_STRING, &the_acl, 'm', "Modify an acl", "ACL" }, - { "add", 'a', POPT_ARG_STRING, &the_acl, 'a', "Add an ACE", "ACL" }, - { "replace", 'R', POPT_ARG_STRING, &the_acl, 'R', "Set share mission ACL", "ACLS" }, + { "remove", 'r', POPT_ARG_STRING, &the_acl, 'r', "Remove ACEs", "ACL" }, + { "modify", 'm', POPT_ARG_STRING, &the_acl, 'm', "Modify existing ACEs", "ACL" }, + { "add", 'a', POPT_ARG_STRING, &the_acl, 'a', "Add ACEs", "ACL" }, + { "replace", 'R', POPT_ARG_STRING, &the_acl, 'R', "Overwrite share permission ACL", "ACLS" }, + { "delete", 'D', POPT_ARG_NONE, NULL, 'D', "Delete the entire security descriptor" }, { "view", 'v', POPT_ARG_NONE, NULL, 'v', "View current share permissions" }, { "machine-sid", 'M', POPT_ARG_NONE, NULL, 'M', "Initialize the machine SID" }, { "force", 'F', POPT_ARG_NONE, NULL, 'F', "Force storing the ACL", "ACLS" }, @@ -555,11 +565,16 @@ int main(int argc, const char *argv[]) the_acl = smb_xstrdup(poptGetOptArg(pc)); mode = SMB_ACL_ADD; break; + case 'R': the_acl = smb_xstrdup(poptGetOptArg(pc)); mode = SMB_ACL_SET; break; + case 'D': + mode = SMB_SD_DELETE; + break; + case 'v': mode = SMB_ACL_VIEW; break; |