diff options
author | Shekhar Amlekar <samlekar@in.ibm.com> | 2014-02-04 14:43:53 +0530 |
---|---|---|
committer | Christof Schmitt <cs@samba.org> | 2014-02-06 09:43:05 -0700 |
commit | 4cda0bf24b3e2565d10c6295513b7f9d66f3cbd9 (patch) | |
tree | 13423faeccbeed4d7d7cae57d18fa7ac707c4701 | |
parent | cc84aa48f0c24afdd9e83bc5816661248e530e44 (diff) | |
download | samba-4cda0bf24b3e2565d10c6295513b7f9d66f3cbd9.tar.gz samba-4cda0bf24b3e2565d10c6295513b7f9d66f3cbd9.tar.xz samba-4cda0bf24b3e2565d10c6295513b7f9d66f3cbd9.zip |
s3: rpc_server/srvsvc: NetShareSetInfo - let CSC policy be settable.
The current code simply denies changing the csc policy through RPC
calls. Change that to allow changing the csc policy and call the 'change
share command' when a SetInfo RPC call changes the setting.
Signed-off-by: Shekhar Amlekar <samlekar@in.ibm.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Christof Schmitt <cs@samba.org>
-rw-r--r-- | source3/rpc_server/srvsvc/srv_srvsvc_nt.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c index 101ee8e102..02938d405c 100644 --- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c +++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c @@ -1511,6 +1511,11 @@ WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p, char *path = NULL; struct security_descriptor *psd = NULL; bool is_disk_op = False; + const char *csc_policy = NULL; + bool csc_policy_changed = false; + const char *csc_policies[] = {"manual", "documents", "programs", + "disable"}; + uint32_t client_csc_policy; int max_connections = 0; TALLOC_CTX *ctx = p->mem_ctx; union srvsvc_NetShareInfo *info = r->in.info; @@ -1562,6 +1567,7 @@ WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p, } max_connections = lp_max_connections(snum); + csc_policy = csc_policies[lp_csc_policy(snum)]; switch (r->in.level) { case 1: @@ -1603,14 +1609,21 @@ WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p, user, so we must compare it to see if it's what is set in smb.conf, so that we can contine other ops like setting ACLs on a share */ - if (((info->info1005->dfs_flags & - SHARE_1005_CSC_POLICY_MASK) >> - SHARE_1005_CSC_POLICY_SHIFT) == lp_csc_policy(snum)) + client_csc_policy = (info->info1005->dfs_flags & + SHARE_1005_CSC_POLICY_MASK) >> + SHARE_1005_CSC_POLICY_SHIFT; + + if (client_csc_policy == lp_csc_policy(snum)) return WERR_OK; else { - DEBUG(3, ("_srvsvc_NetShareSetInfo: client is trying to change csc policy from the network; must be done with smb.conf\n")); - return WERR_ACCESS_DENIED; + csc_policy = csc_policies[client_csc_policy]; + csc_policy_changed = true; } + + pathname = lp_path(ctx, snum); + comment = lp_comment(ctx, snum); + type = STYPE_DISKTREE; + break; case 1006: case 1007: return WERR_ACCESS_DENIED; @@ -1657,20 +1670,23 @@ WERROR _srvsvc_NetShareSetInfo(struct pipes_struct *p, /* Only call modify function if something changed. */ if (strcmp(path, lp_path(talloc_tos(), snum)) || strcmp(comment, lp_comment(talloc_tos(), snum)) - || (lp_max_connections(snum) != max_connections)) { + || (lp_max_connections(snum) != max_connections) + || csc_policy_changed) { + if (!lp_change_share_cmd(talloc_tos()) || !*lp_change_share_cmd(talloc_tos())) { DEBUG(10,("_srvsvc_NetShareSetInfo: No change share command\n")); return WERR_ACCESS_DENIED; } command = talloc_asprintf(p->mem_ctx, - "%s \"%s\" \"%s\" \"%s\" \"%s\" %d", + "%s \"%s\" \"%s\" \"%s\" \"%s\" %d \"%s\"", lp_change_share_cmd(talloc_tos()), get_dyn_CONFIGFILE(), share_name, path, comment ? comment : "", - max_connections); + max_connections, + csc_policy); if (!command) { return WERR_NOMEM; } |