svn commit: samba r15272 - in branches/SAMBA_4_0/source/rpc_server/srvsvc: .

metze at samba.org metze at samba.org
Wed Apr 26 12:07:03 GMT 2006


Author: metze
Date: 2006-04-26 12:07:01 +0000 (Wed, 26 Apr 2006)
New Revision: 15272

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15272

Log:
- implement NetShareEnum
- add access checks to NEtShareEnumAll and NetShareEnum

metze
Modified:
   branches/SAMBA_4_0/source/rpc_server/srvsvc/dcesrv_srvsvc.c


Changeset:
Modified: branches/SAMBA_4_0/source/rpc_server/srvsvc/dcesrv_srvsvc.c
===================================================================
--- branches/SAMBA_4_0/source/rpc_server/srvsvc/dcesrv_srvsvc.c	2006-04-26 11:58:42 UTC (rev 15271)
+++ branches/SAMBA_4_0/source/rpc_server/srvsvc/dcesrv_srvsvc.c	2006-04-26 12:07:01 UTC (rev 15272)
@@ -24,8 +24,18 @@
 #include "rpc_server/dcerpc_server.h"
 #include "librpc/gen_ndr/ndr_srvsvc.h"
 #include "rpc_server/common/common.h"
+#include "auth/auth.h"
+#include "libcli/security/security.h"
 #include "system/time.h"
 
+#define SRVSVC_CHECK_ADMIN_ACCESS do { \
+	struct security_token *t = dce_call->conn->auth_state.session_info->security_token; \
+	if (!security_token_has_builtin_administrators(t) && \
+	    !security_token_has_sid_string(t, SID_BUILTIN_SERVER_OPERATORS)) { \
+	    	return WERR_ACCESS_DENIED; \
+	} \
+} while (0)
+
 /* 
   srvsvc_NetCharDevEnum 
 */
@@ -547,7 +557,6 @@
 	r->out.resume_handle = NULL;
 
 	/* TODO: - paging of results 
-	 *       - access check
 	 */
 
 	switch (r->in.level) {
@@ -624,6 +633,8 @@
 		int i;
 		struct srvsvc_NetShareCtr2 *ctr2;
 
+		SRVSVC_CHECK_ADMIN_ACCESS;
+
 		ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
 		W_ERROR_HAVE_NO_MEMORY(ctr2);
 
@@ -658,6 +669,8 @@
 		int i;
 		struct srvsvc_NetShareCtr501 *ctr501;
 
+		SRVSVC_CHECK_ADMIN_ACCESS;
+
 		ctr501 = talloc(mem_ctx, struct srvsvc_NetShareCtr501);
 		W_ERROR_HAVE_NO_MEMORY(ctr501);
 
@@ -692,6 +705,8 @@
 		int i;
 		struct srvsvc_NetShareCtr502 *ctr502;
 
+		SRVSVC_CHECK_ADMIN_ACCESS;
+
 		ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
 		W_ERROR_HAVE_NO_MEMORY(ctr502);
 
@@ -789,6 +804,8 @@
 		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);
 
@@ -821,6 +838,8 @@
 		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);
 
@@ -1171,7 +1190,190 @@
 static WERROR srvsvc_NetShareEnum(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
 		       struct srvsvc_NetShareEnum *r)
 {
-	DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+	struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
+
+	r->out.level = r->in.level;
+	ZERO_STRUCT(r->out.ctr);
+	r->out.totalentries = 0;
+	r->out.resume_handle = NULL;
+
+	/* TODO: - paging of results 
+	 */
+
+	switch (r->in.level) {
+	case 0:
+	{
+		int i, y = 0;
+		int count;
+		struct srvsvc_NetShareCtr0 *ctr0;
+
+		ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
+		W_ERROR_HAVE_NO_MEMORY(ctr0);
+
+		count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+		ctr0->count = count;
+		ctr0->array = NULL;
+
+		if (ctr0->count == 0) {
+			r->out.ctr.ctr0	= ctr0;
+			return WERR_OK;
+		}
+
+		ctr0->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo0, count);
+		W_ERROR_HAVE_NO_MEMORY(ctr0->array);
+
+		for (i=0; i < count; i++) {
+			WERROR status;
+			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
+
+			if (type & STYPE_HIDDEN) {
+				ctr0->count--;
+				continue;
+			}
+
+			info.info0 = &ctr0->array[y];
+			status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+			W_ERROR_NOT_OK_RETURN(status);
+			y++;
+		}
+
+		r->out.ctr.ctr0		= ctr0;
+		r->out.totalentries	= r->out.ctr.ctr0->count;
+		return WERR_OK;
+	}
+	case 1:
+	{
+		int i, y = 0;
+		int count;
+		struct srvsvc_NetShareCtr1 *ctr1;
+
+		ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
+		W_ERROR_HAVE_NO_MEMORY(ctr1);
+
+		count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+		ctr1->count = count;
+		ctr1->array = NULL;
+
+		if (ctr1->count == 0) {
+			r->out.ctr.ctr1	= ctr1;
+			return WERR_OK;
+		}
+
+		ctr1->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo1, count);
+		W_ERROR_HAVE_NO_MEMORY(ctr1->array);
+
+		for (i=0; i < count; i++) {
+			WERROR status;
+			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
+
+			if (type & STYPE_HIDDEN) {
+				ctr1->count--;
+				continue;
+			}
+
+			info.info1 = &ctr1->array[y];
+			status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+			W_ERROR_NOT_OK_RETURN(status);
+			y++;
+		}
+
+		r->out.ctr.ctr1		= ctr1;
+		r->out.totalentries	= r->out.ctr.ctr1->count;
+		return WERR_OK;
+	}
+	case 2:
+	{
+		int i, y = 0;
+		int count;
+		struct srvsvc_NetShareCtr2 *ctr2;
+
+		SRVSVC_CHECK_ADMIN_ACCESS;
+
+		ctr2 = talloc(mem_ctx, struct srvsvc_NetShareCtr2);
+		W_ERROR_HAVE_NO_MEMORY(ctr2);
+
+		count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+		ctr2->count = count;
+		ctr2->array = NULL;
+
+		if (ctr2->count == 0) {
+			r->out.ctr.ctr2 = ctr2;
+			return WERR_OK;
+		}
+
+		ctr2->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo2, count);
+		W_ERROR_HAVE_NO_MEMORY(ctr2->array);
+
+		for (i=0; i < count; i++) {
+			WERROR status;
+			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
+
+			if (type & STYPE_HIDDEN) {
+				ctr2->count--;
+				continue;
+			}
+
+			info.info2 = &ctr2->array[y];
+			status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+			W_ERROR_NOT_OK_RETURN(status);
+			y++;
+		}
+
+		r->out.ctr.ctr2		= ctr2;
+		r->out.totalentries	= r->out.ctr.ctr2->count;
+		return WERR_OK;
+	}
+	case 502:
+	{
+		int i, y = 0;
+		int count;
+		struct srvsvc_NetShareCtr502 *ctr502;
+
+		SRVSVC_CHECK_ADMIN_ACCESS;
+
+		ctr502 = talloc(mem_ctx, struct srvsvc_NetShareCtr502);
+		W_ERROR_HAVE_NO_MEMORY(ctr502);
+
+		count = dcesrv_common_get_count_of_shares(mem_ctx, dce_ctx);
+		ctr502->count = count;
+		ctr502->array = NULL;
+
+		if (ctr502->count == 0) {
+			r->out.ctr.ctr502 = ctr502;
+			return WERR_OK;
+		}
+
+		ctr502->array = talloc_array(mem_ctx, struct srvsvc_NetShareInfo502, count);
+		W_ERROR_HAVE_NO_MEMORY(ctr502->array);
+
+		for (i=0; i < count; i++) {
+			WERROR status;
+			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, i);
+
+			if (type & STYPE_HIDDEN) {
+				ctr502->count--;
+				continue;
+			}
+
+			info.info502 = &ctr502->array[y];
+			status = srvsvc_fiel_ShareInfo(dce_call, mem_ctx, i, r->in.level, &info);
+			W_ERROR_NOT_OK_RETURN(status);
+			y++;
+		}
+
+		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;
 }
 
 



More information about the samba-cvs mailing list