From fa257e78b5e1de1ba12e12968b1b2a6edbead7c6 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 15 Sep 2006 16:27:55 +0000 Subject: r18558: Fix ShareCheck which was assuming all paths are "C:\" Also cope with the fact that we define the FSTYPE as NTFS by default. We never use this anywhere else, so we may just change it, but just detect the fact and return DISK in share_classic for now. (This used to be commit 4daf5f7764ce69c14066f7320961c90141f0863a) --- source4/param/share_classic.c | 3 + source4/rpc_server/common/share_info.c | 5 +- source4/rpc_server/srvsvc/dcesrv_srvsvc.c | 141 +++++++++++++++++++++++++++--- 3 files changed, 135 insertions(+), 14 deletions(-) diff --git a/source4/param/share_classic.c b/source4/param/share_classic.c index 75f66b1fd4..794a21c5bf 100644 --- a/source4/param/share_classic.c +++ b/source4/param/share_classic.c @@ -84,6 +84,9 @@ static const char *sclassic_string_option(struct share_config *scfg, const char if (lp_print_ok(s->snum)) { return "PRINTER"; } + if (strcmp("NTFS", lp_fstype(s->snum)) == 0) { + return "DISK"; + } return lp_fstype(s->snum); } diff --git a/source4/rpc_server/common/share_info.c b/source4/rpc_server/common/share_info.c index cb6ce8b206..25eacf578d 100644 --- a/source4/rpc_server/common/share_info.c +++ b/source4/rpc_server/common/share_info.c @@ -87,10 +87,13 @@ const char *dcesrv_common_get_share_path(TALLOC_CTX *mem_ctx, struct dcesrv_cont return talloc_strdup(mem_ctx, ""); } - p = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PATH, "/")); + p = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PATH, "")); if (!p) { return NULL; } + if (p[0] == '\0') { + return p; + } all_string_sub(p, "/", "\\", 0); return talloc_asprintf(mem_ctx, "C:%s", p); diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c index 68ab1498c2..2ca5c8ee97 100644 --- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c +++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c @@ -455,7 +455,7 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX NTSTATUS nterr; struct share_info *info; struct share_context *sctx; - + nterr = share_get_context(mem_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); @@ -481,14 +481,17 @@ static WERROR srvsvc_NetShareAdd(struct dcesrv_call_state *dce_call, TALLOC_CTX } W_ERROR_HAVE_NO_MEMORY(info->type); - /* Windows will send a path in a form of C:\example\path */ - if (r->in.info.info502->path[1] == ':') { - info->path = talloc_strdup(info, &r->in.info.info502->path[2]); - } else { - info->path = talloc_strdup(info, r->in.info.info502->path); + if (r->in.info.info502->path && r->in.info.info502->path[0]) { + /* Windows will send a path in a form of C:\example\path */ + if (strncmp(r->in.info.info502->path, "C:", 2) == 0) { + info->path = talloc_strdup(info, &r->in.info.info502->path[2]); + } else { + /* very strange let's try to set as is */ + info->path = talloc_strdup(info, r->in.info.info502->path); + } + W_ERROR_HAVE_NO_MEMORY(info->path); + all_string_sub(info->path, "\\", "/", 0); } - W_ERROR_HAVE_NO_MEMORY(info->path); - all_string_sub(info->path, "\\", "/", 0); if (r->in.info.info502->comment && r->in.info.info502->comment[0]) { info->comment = talloc_strdup(info, r->in.info.info502->comment); @@ -998,7 +1001,67 @@ static WERROR srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_ static WERROR srvsvc_NetShareSetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareSetInfo *r) { - DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR); + NTSTATUS nterr; + struct share_context *sctx = NULL; + struct share_config *scfg = NULL; + + ZERO_STRUCT(r->out); + + /* TODO: - access check + */ + + if (strcmp("", r->in.share_name) == 0) { + return WERR_INVALID_PARAM; + } + + nterr = share_get_context(mem_ctx, &sctx); + if (!NT_STATUS_IS_OK(nterr)) { + return ntstatus_to_werror(nterr); + } + + switch (r->in.level) { + case 0: + { + return WERR_NOT_SUPPORTED; + } + case 1: + { + return WERR_NOT_SUPPORTED; + } + case 2: + { + return WERR_NOT_SUPPORTED; + } + case 501: + { + return WERR_NOT_SUPPORTED; + } + case 502: + { + return WERR_NOT_SUPPORTED; + } + case 1004: + { + WERROR status; + union srvsvc_NetShareInfo info; + + /* r->out.info.comment; */ + return WERR_NOT_SUPPORTED; + } + case 1005: + { + WERROR status; + union srvsvc_NetShareInfo info; + + /* r->out.info.dfs_flags; */ + + return WERR_NOT_SUPPORTED; + } + default: + return WERR_UNKNOWN_LEVEL; + } + + return WERR_UNKNOWN_LEVEL; } @@ -1018,6 +1081,13 @@ static WERROR srvsvc_NetShareDelSticky(struct dcesrv_call_state *dce_call, TALLO static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareCheck *r) { + NTSTATUS nterr; + struct share_context *sctx = NULL; + struct share_config *scfg = NULL; + char *device; + const char **names; + int count, i; + ZERO_STRUCT(r->out); /* TODO: - access check @@ -1028,12 +1098,57 @@ static WERROR srvsvc_NetShareCheck(struct dcesrv_call_state *dce_call, TALLOC_CT return WERR_OK; } - if (strcmp("C:\\", r->in.device_name) == 0) { - r->out.type = STYPE_DISKTREE; - return WERR_OK; + /* copy the path skipping C:\ */ + if (strncasecmp(r->in.device_name, "C:", 2) == 0) { + device = talloc_strdup(mem_ctx, &r->in.device_name[2]); + } else { + /* no chance we have a share that doesn't start with C:\ */ + return WERR_DEVICE_NOT_SHARED; + } + all_string_sub(device, "\\", "/", 0); + + nterr = share_get_context(mem_ctx, &sctx); + if (!NT_STATUS_IS_OK(nterr)) { + return ntstatus_to_werror(nterr); + } + + nterr = share_list_all(mem_ctx, sctx, &count, &names); + if (!NT_STATUS_IS_OK(nterr)) { + return ntstatus_to_werror(nterr); + } + + for (i = 0; i < count; i++) { + const char *path; + const char *type; + + nterr = share_get_config(mem_ctx, sctx, names[i], &scfg); + if (!NT_STATUS_IS_OK(nterr)) { + return ntstatus_to_werror(nterr); + } + path = share_string_option(scfg, SHARE_PATH, NULL); + if (!path) continue; + + if (strcmp(device, path) == 0) { + type = share_string_option(scfg, SHARE_TYPE, NULL); + if (!type) continue; + + if (strcmp(type, "DISK") == 0) { + r->out.type = STYPE_DISKTREE; + return WERR_OK; + } + + if (strcmp(type, "IPC") == 0) { + r->out.type = STYPE_IPC; + return WERR_OK; + } + + if (strcmp(type, "PRINTER") == 0) { + r->out.type = STYPE_PRINTQ; + return WERR_OK; + } + } } - /* TODO: - lookup the share be devicename (path) */ return WERR_DEVICE_NOT_SHARED; } -- cgit