summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShekhar Amlekar <samlekar@in.ibm.com>2014-02-04 14:43:53 +0530
committerChristof Schmitt <cs@samba.org>2014-02-06 09:43:05 -0700
commit4cda0bf24b3e2565d10c6295513b7f9d66f3cbd9 (patch)
tree13423faeccbeed4d7d7cae57d18fa7ac707c4701
parentcc84aa48f0c24afdd9e83bc5816661248e530e44 (diff)
downloadsamba-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.c32
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;
}