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 + -
显示快捷键?