dcesrv_srvsvc.c
来自「samba最新软件」· C语言 代码 · 共 2,328 行 · 第 1/4 页
C
2,328 行
/* very strange let's try to set as is */ info[i].value = talloc_strdup(info, r->in.info.info502->path); } W_ERROR_HAVE_NO_MEMORY(info[i].value); all_string_sub((char *)info[i].value, "\\", "/", 0); i++; } if (r->in.info.info502->comment && r->in.info.info502->comment[0]) { info[i].name = SHARE_COMMENT; info[i].type = SHARE_INFO_STRING; info[i].value = talloc_strdup(info, r->in.info.info502->comment); W_ERROR_HAVE_NO_MEMORY(info[i].value); i++; } if (r->in.info.info502->password && r->in.info.info502->password[0]) { info[i].name = SHARE_PASSWORD; info[i].type = SHARE_INFO_STRING; info[i].value = talloc_strdup(info, r->in.info.info502->password); W_ERROR_HAVE_NO_MEMORY(info[i].value); i++; } info[i].name = SHARE_MAX_CONNECTIONS; info[i].type = SHARE_INFO_INT; info[i].value = talloc(info, int); *((int *)info[i].value) = r->in.info.info502->max_users; i++; /* TODO: security descriptor */ nterr = share_create(sctx, r->in.info.info502->name, info, i); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } if (r->in.parm_error) { r->out.parm_error = r->in.parm_error; } return WERR_OK; } default: return WERR_UNKNOWN_LEVEL; } return WERR_UNKNOWN_LEVEL;}static WERROR dcesrv_srvsvc_fiel_ShareInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct share_config *scfg, uint32_t level, union srvsvc_NetShareInfo *info){ struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx; switch (level) { case 0: { info->info0->name = talloc_strdup(mem_ctx, scfg->name); W_ERROR_HAVE_NO_MEMORY(info->info0->name); return WERR_OK; } case 1: { info->info1->name = talloc_strdup(mem_ctx, scfg->name); W_ERROR_HAVE_NO_MEMORY(info->info1->name); info->info1->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); info->info1->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, "")); W_ERROR_HAVE_NO_MEMORY(info->info1->comment); return WERR_OK; } case 2: { info->info2->name = talloc_strdup(mem_ctx, scfg->name); W_ERROR_HAVE_NO_MEMORY(info->info2->name); info->info2->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); info->info2->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, "")); W_ERROR_HAVE_NO_MEMORY(info->info2->comment); info->info2->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg); info->info2->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT); info->info2->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg); info->info2->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg); W_ERROR_HAVE_NO_MEMORY(info->info2->path); info->info2->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL)); return WERR_OK; } case 501: { info->info501->name = talloc_strdup(mem_ctx, scfg->name); W_ERROR_HAVE_NO_MEMORY(info->info501->name); info->info501->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); info->info501->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, "")); W_ERROR_HAVE_NO_MEMORY(info->info501->comment); info->info501->csc_policy = share_int_option(scfg, SHARE_CSC_POLICY, SHARE_CSC_POLICY_DEFAULT); return WERR_OK; } case 502: { info->info502->name = talloc_strdup(mem_ctx, scfg->name); W_ERROR_HAVE_NO_MEMORY(info->info502->name); info->info502->type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg); info->info502->comment = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_COMMENT, "")); W_ERROR_HAVE_NO_MEMORY(info->info502->comment); info->info502->permissions = dcesrv_common_get_share_permissions(mem_ctx, dce_ctx, scfg); info->info502->max_users = share_int_option(scfg, SHARE_MAX_CONNECTIONS, SHARE_MAX_CONNECTIONS_DEFAULT); info->info502->current_users = dcesrv_common_get_share_current_users(mem_ctx, dce_ctx, scfg); info->info502->path = dcesrv_common_get_share_path(mem_ctx, dce_ctx, scfg); W_ERROR_HAVE_NO_MEMORY(info->info502->path); info->info502->password = talloc_strdup(mem_ctx, share_string_option(scfg, SHARE_PASSWORD, NULL)); info->info502->unknown = dcesrv_common_get_share_unknown(mem_ctx, dce_ctx, scfg); info->info502->sd = dcesrv_common_get_security_descriptor(mem_ctx, dce_ctx, scfg); return WERR_OK; } case 1005: { info->info1005->dfs_flags = dcesrv_common_get_share_dfs_flags(mem_ctx, dce_ctx, scfg); return WERR_OK; } default: return WERR_UNKNOWN_LEVEL; } return WERR_UNKNOWN_LEVEL;}/* srvsvc_NetShareEnumAll*/static WERROR dcesrv_srvsvc_NetShareEnumAll(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareEnumAll *r){ NTSTATUS nterr; int numshares = 0; const char **snames; struct share_context *sctx; struct share_config *scfg; r->out.level = r->in.level; ZERO_STRUCT(r->out.ctr); r->out.totalentries = 0; r->out.resume_handle = NULL; /* TODO: - paging of results */ nterr = share_get_context_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } nterr = share_list_all(mem_ctx, sctx, &numshares, &snames); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } switch (r->in.level) { case 0: { int i; struct srvsvc_NetShareCtr0 *ctr0; ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0); W_ERROR_HAVE_NO_MEMORY(ctr0); ctr0->count = numshares; ctr0->array = NULL; if (ctr0->count == 0) { r->out.ctr.ctr0 = ctr0; return WERR_OK; } ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, ctr0->count); W_ERROR_HAVE_NO_MEMORY(ctr0->array); for (i = 0; i < ctr0->count; i++) { WERROR status; union srvsvc_NetShareInfo info; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } info.info0 = &ctr0->array[i]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } talloc_free(scfg); } talloc_free(snames); r->out.ctr.ctr0 = ctr0; r->out.totalentries = r->out.ctr.ctr0->count; return WERR_OK; } case 1: { int i; struct srvsvc_NetShareCtr1 *ctr1; ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1); W_ERROR_HAVE_NO_MEMORY(ctr1); ctr1->count = numshares; ctr1->array = NULL; if (ctr1->count == 0) { r->out.ctr.ctr1 = ctr1; return WERR_OK; } ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, ctr1->count); W_ERROR_HAVE_NO_MEMORY(ctr1->array); for (i=0; i < ctr1->count; i++) { WERROR status; union srvsvc_NetShareInfo info; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } info.info1 = &ctr1->array[i]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } talloc_free(scfg); } talloc_free(snames); r->out.ctr.ctr1 = ctr1; r->out.totalentries = r->out.ctr.ctr1->count; return WERR_OK; } case 2: { int i; struct srvsvc_NetShareCtr2 *ctr2; SRVSVC_CHECK_ADMIN_ACCESS; ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2); W_ERROR_HAVE_NO_MEMORY(ctr2); ctr2->count = numshares; ctr2->array = NULL; if (ctr2->count == 0) { r->out.ctr.ctr2 = ctr2; return WERR_OK; } ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, ctr2->count); W_ERROR_HAVE_NO_MEMORY(ctr2->array); for (i=0; i < ctr2->count; i++) { WERROR status; union srvsvc_NetShareInfo info; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } info.info2 = &ctr2->array[i]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } talloc_free(scfg); } talloc_free(snames); r->out.ctr.ctr2 = ctr2; r->out.totalentries = r->out.ctr.ctr2->count; return WERR_OK; } case 501: { int i; struct srvsvc_NetShareCtr501 *ctr501; SRVSVC_CHECK_ADMIN_ACCESS; ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501); W_ERROR_HAVE_NO_MEMORY(ctr501); ctr501->count = numshares; ctr501->array = NULL; if (ctr501->count == 0) { r->out.ctr.ctr501 = ctr501; return WERR_OK; } ctr501->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo501, ctr501->count); W_ERROR_HAVE_NO_MEMORY(ctr501->array); for (i=0; i < ctr501->count; i++) { WERROR status; union srvsvc_NetShareInfo info; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } info.info501 = &ctr501->array[i]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } talloc_free(scfg); } talloc_free(snames); r->out.ctr.ctr501 = ctr501; r->out.totalentries = r->out.ctr.ctr501->count; return WERR_OK; } case 502: { int i; struct srvsvc_NetShareCtr502 *ctr502; SRVSVC_CHECK_ADMIN_ACCESS; ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502); W_ERROR_HAVE_NO_MEMORY(ctr502); ctr502->count = numshares; ctr502->array = NULL; if (ctr502->count == 0) { r->out.ctr.ctr502 = ctr502; return WERR_OK; } ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, ctr502->count); W_ERROR_HAVE_NO_MEMORY(ctr502->array); for (i=0; i < ctr502->count; i++) { WERROR status; union srvsvc_NetShareInfo info; nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg); if (!NT_STATUS_IS_OK(nterr)) { DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i])); return WERR_GENERAL_FAILURE; } info.info502 = &ctr502->array[i]; status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } talloc_free(scfg); } talloc_free(snames); r->out.ctr.ctr502 = ctr502; r->out.totalentries = r->out.ctr.ctr502->count; return WERR_OK; } default: return WERR_UNKNOWN_LEVEL; } return WERR_UNKNOWN_LEVEL;}/* srvsvc_NetShareGetInfo */static WERROR dcesrv_srvsvc_NetShareGetInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx, struct srvsvc_NetShareGetInfo *r){ 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_by_name(mem_ctx, lp_share_backend(dce_call->conn->dce_ctx->lp_ctx), dce_call->event_ctx, dce_call->conn->dce_ctx->lp_ctx, &sctx); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } nterr = share_get_config(mem_ctx, sctx, r->in.share_name, &scfg); if (!NT_STATUS_IS_OK(nterr)) { return ntstatus_to_werror(nterr); } switch (r->in.level) { case 0: { WERROR status; union srvsvc_NetShareInfo info; info.info0 = talloc(mem_ctx, struct srvsvc_NetShareInfo0); W_ERROR_HAVE_NO_MEMORY(info.info0); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info0 = info.info0; return WERR_OK; } case 1: { WERROR status; union srvsvc_NetShareInfo info; info.info1 = talloc(mem_ctx, struct srvsvc_NetShareInfo1); W_ERROR_HAVE_NO_MEMORY(info.info1); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info1 = info.info1; return WERR_OK; } case 2: { WERROR status; union srvsvc_NetShareInfo info; SRVSVC_CHECK_ADMIN_ACCESS; info.info2 = talloc(mem_ctx, struct srvsvc_NetShareInfo2); W_ERROR_HAVE_NO_MEMORY(info.info2); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info2 = info.info2; return WERR_OK; } case 501: { WERROR status; union srvsvc_NetShareInfo info; info.info501 = talloc(mem_ctx, struct srvsvc_NetShareInfo501); W_ERROR_HAVE_NO_MEMORY(info.info501); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info501 = info.info501; return WERR_OK; } case 502: { WERROR status; union srvsvc_NetShareInfo info; SRVSVC_CHECK_ADMIN_ACCESS; info.info502 = talloc(mem_ctx, struct srvsvc_NetShareInfo502); W_ERROR_HAVE_NO_MEMORY(info.info502); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info502 = info.info502; return WERR_OK; } case 1005: { WERROR status; union srvsvc_NetShareInfo info; info.info1005 = talloc(mem_ctx, struct srvsvc_NetShareInfo1005); W_ERROR_HAVE_NO_MEMORY(info.info1005); status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, r->in.level, &info); if (!W_ERROR_IS_OK(status)) { return status; } r->out.info.info1005 = info.info1005; return WERR_OK; } default: return WERR_UNKNOWN_LEVEL; } return WERR_UNKNOWN_LEVEL;}static WERROR dcesrv_srvsvc_fill_share_info(struct share_info *info, int *count, const char *share_name, int level, const char *name, const char *path, const char *comment, const char *password, enum srvsvc_ShareType type, int32_t max_users, uint32_t csc_policy, struct security_descriptor *sd){ int i = 0; if (level == 501) { info[i].name = SHARE_CSC_POLICY; info[i].type = SHARE_INFO_INT; info[i].value = talloc(info, int); *((int *)info[i].value) = csc_policy; i++; } switch(level) { case 502: /* TODO: check if unknown is csc_policy */ /* TODO: security descriptor */ case 2: if (path && path[0]) { info[i].name = SHARE_PATH; info[i].type = SHARE_INFO_STRING; /* Windows will send a path in a form of C:\example\path */ if (path[1] == ':') { info[i].value = talloc_strdup(info, &path[2]); } else { /* very strange let's try to set as is */ info[i].value = talloc_strdup(info, path); } W_ERROR_HAVE_NO_MEMORY(info[i].value); all_string_sub((char *)info[i].value, "\\", "/", 0); i++; } if (password && password[0]) { info[i].name = SHARE_PASSWORD; info[i].type = SHARE_INFO_STRING; info[i].value = talloc_strdup(info, password); W_ERROR_HAVE_NO_MEMORY(info[i].value); i++; } info[i].name = SHARE_MAX_CONNECTIONS; info[i].type = SHARE_INFO_INT; info[i].value = talloc(info, int); *((int *)info[i].value) = max_users; i++;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?