[SCM] Samba Shared Repository - branch master updated - a0abb933d2acd8455a0560bfdbcc21deaf025432

Kai Blin kai at samba.org
Thu Jan 15 09:36:46 GMT 2009


The branch, master has been updated
       via  a0abb933d2acd8455a0560bfdbcc21deaf025432 (commit)
       via  ec93fd6b0ccec34c109958137517d8c131033cd7 (commit)
      from  907f085296e4c61410a7a0e2cfcd6a9db8176b16 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a0abb933d2acd8455a0560bfdbcc21deaf025432
Author: Kai Blin <kai at samba.org>
Date:   Thu Jan 15 10:14:55 2009 +0100

    s4-winbind: Add support for the WINBINDD_LIST_GROUPS command.

commit ec93fd6b0ccec34c109958137517d8c131033cd7
Author: Kai Blin <kai at samba.org>
Date:   Wed Jan 14 13:49:14 2009 +0100

    s4 torture: Add another wbinfo test and fix a typo in another one

-----------------------------------------------------------------------

Summary of changes:
 nsswitch/tests/test_wbinfo.sh                      |    7 +-
 source4/winbind/config.mk                          |    1 +
 .../{wb_cmd_list_users.c => wb_cmd_list_groups.c}  |   98 ++++++++++----------
 source4/winbind/wb_samba3_cmd.c                    |   45 +++++++++
 source4/winbind/wb_samba3_protocol.c               |    6 +-
 5 files changed, 103 insertions(+), 54 deletions(-)
 copy source4/winbind/{wb_cmd_list_users.c => wb_cmd_list_groups.c} (56%)


Changeset truncated at 500 lines:

diff --git a/nsswitch/tests/test_wbinfo.sh b/nsswitch/tests/test_wbinfo.sh
index 88bffc5..84876e3 100755
--- a/nsswitch/tests/test_wbinfo.sh
+++ b/nsswitch/tests/test_wbinfo.sh
@@ -54,8 +54,7 @@ knownfail() {
 # List users
 testit "wbinfo -u against $TARGET" $wbinfo -u || failed=`expr $failed + 1`
 # List groups
-# Does not work yet
-knownfail "wbinfo -g against $TARGET" $wbinfo -g || failed=`expr $failed + 1`
+testit "wbinfo -g against $TARGET" $wbinfo -g || failed=`expr $failed + 1`
 # Convert netbios name to IP
 # Does not work yet
 knownfail "wbinfo -N against $TARGET" $wbinfo -N $NETBIOSNAME || failed=`expr $failed + 1`
@@ -174,6 +173,7 @@ testit "wbinfo --uid-info against $TARGET" $wbinfo --uid-info $admin_uid
 
 # this does not work
 knownfail "wbinfo --group-info against $TARGET" $wbinfo --group-info "S-1-22-2-0"
+knownfail "wbinfo --gid-info against $TARGET" $wbinfo --gid-info 30001
 knownfail "wbinfo -r against $TARGET" $wbinfo -r "$DOMAIN/$USERNAME"
 
 testit "wbinfo --user-domgroups against $TARGET" $wbinfo --user-domgroups $admin_sid || failed=`expr $failed + 1`
@@ -182,8 +182,7 @@ testit "wbinfo --user-sids against $TARGET" $wbinfo --user-sids $admin_sid || fa
 
 testit "wbinfo -a against $TARGET with domain creds" $wbinfo -a "$DOMAIN/$USERNAME"%"$PASSWORD" || failed=`expr $failed + 1`
 
-# this does not work
-knwonfail "wbinfo --getdcname against $TARGET" $wbinfo --getdcname=$DOMAIN
+testit "wbinfo --getdcname against $TARGET" $wbinfo --getdcname=$DOMAIN
 
 testit "wbinfo -p against $TARGET" $wbinfo -p || failed=`expr $failed + 1`
 
diff --git a/source4/winbind/config.mk b/source4/winbind/config.mk
index eb781cd..16c1652 100644
--- a/source4/winbind/config.mk
+++ b/source4/winbind/config.mk
@@ -46,6 +46,7 @@ WINBIND_OBJ_FILES = $(addprefix $(winbindsrcdir)/, \
 		wb_cmd_getpwuid.o \
 		wb_cmd_userdomgroups.o \
 		wb_cmd_usersids.o \
+		wb_cmd_list_groups.o \
 		wb_cmd_list_trustdom.o \
 		wb_cmd_list_users.o \
 		wb_cmd_setpwent.o \
diff --git a/source4/winbind/wb_cmd_list_users.c b/source4/winbind/wb_cmd_list_groups.c
similarity index 56%
copy from source4/winbind/wb_cmd_list_users.c
copy to source4/winbind/wb_cmd_list_groups.c
index f67f133..04a4fc3 100644
--- a/source4/winbind/wb_cmd_list_users.c
+++ b/source4/winbind/wb_cmd_list_groups.c
@@ -1,9 +1,9 @@
 /*
    Unix SMB/CIFS implementation.
 
-   Command backend for wbinfo -u
+   Command backend for wbinfo -g
 
-   Copyright (C) Kai Blin 2007
+   Copyright (C) Kai Blin 2009
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -27,31 +27,31 @@
 #include "smbd/service_task.h"
 #include "libnet/libnet_proto.h"
 
-struct cmd_list_users_state {
+struct cmd_list_groups_state {
 	struct composite_context *ctx;
 	struct wbsrv_service *service;
 
 	struct wbsrv_domain *domain;
 	char *domain_name;
-	uint resume_index;
+	uint32_t resume_index;
 	char *result;
 };
 
-static void cmd_list_users_recv_domain(struct composite_context *ctx);
-static void cmd_list_users_recv_user_list(struct composite_context *ctx);
+static void cmd_list_groups_recv_domain(struct composite_context *ctx);
+static void cmd_list_groups_recv_group_list(struct composite_context *ctx);
 
-struct composite_context *wb_cmd_list_users_send(TALLOC_CTX *mem_ctx,
+struct composite_context *wb_cmd_list_groups_send(TALLOC_CTX *mem_ctx,
 		struct wbsrv_service *service, const char *domain_name)
 {
 	struct composite_context *ctx, *result;
-	struct cmd_list_users_state *state;
+	struct cmd_list_groups_state *state;
 
-	DEBUG(5, ("wb_cmd_list_users_send called\n"));
+	DEBUG(5, ("wb_cmd_list_groups_send called\n"));
 
 	result = composite_create(mem_ctx, service->task->event_ctx);
 	if (!result) return NULL;
 
-	state = talloc(result, struct cmd_list_users_state);
+	state = talloc(result, struct cmd_list_groups_state);
 	if (composite_nomem(state, result)) return result;
 
 	state->ctx = result;
@@ -76,18 +76,18 @@ struct composite_context *wb_cmd_list_users_send(TALLOC_CTX *mem_ctx,
 	ctx = wb_sid2domain_send(state, service, service->primary_sid);
 	if (composite_nomem(ctx, state->ctx)) return result;
 
-	composite_continue(state->ctx, ctx, cmd_list_users_recv_domain, state);
+	composite_continue(state->ctx, ctx, cmd_list_groups_recv_domain, state);
 	return result;
 }
 
-static void cmd_list_users_recv_domain(struct composite_context *ctx)
+static void cmd_list_groups_recv_domain(struct composite_context *ctx)
 {
-	struct cmd_list_users_state *state = talloc_get_type(
-			ctx->async.private_data, struct cmd_list_users_state);
+	struct cmd_list_groups_state *state = talloc_get_type(
+			ctx->async.private_data, struct cmd_list_groups_state);
 	struct wbsrv_domain *domain;
-	struct libnet_UserList *user_list;
+	struct libnet_GroupList *group_list;
 
-	DEBUG(5, ("cmd_list_users_recv_domain called\n"));
+	DEBUG(5, ("cmd_list_groups_recv_domain called\n"));
 
 	state->ctx->status = wb_sid2domain_recv(ctx, &domain);
 	if (!composite_is_ok(state->ctx)) return;
@@ -102,37 +102,37 @@ static void cmd_list_users_recv_domain(struct composite_context *ctx)
 		if (composite_nomem(state->domain_name, state->ctx)) return;
 	}
 
-	user_list = talloc(state, struct libnet_UserList);
-	if (composite_nomem(user_list, state->ctx)) return;
+	group_list = talloc(state, struct libnet_GroupList);
+	if (composite_nomem(group_list, state->ctx)) return;
 
-	user_list->in.domain_name = state->domain_name;
+	group_list->in.domain_name = state->domain_name;
 
 	/* Rafal suggested that 128 is a good number here. I don't like magic
 	 * numbers too much, but for now it'll have to do.
 	 */
-	user_list->in.page_size = 128;
-	user_list->in.resume_index = state->resume_index;
+	group_list->in.page_size = 128;
+	group_list->in.resume_index = state->resume_index;
 
-	ctx = libnet_UserList_send(domain->libnet_ctx, state, user_list, NULL);
+	ctx = libnet_GroupList_send(domain->libnet_ctx, state, group_list,NULL);
 
-	composite_continue(state->ctx, ctx, cmd_list_users_recv_user_list,
+	composite_continue(state->ctx, ctx, cmd_list_groups_recv_group_list,
 			state);
 }
 
-static void cmd_list_users_recv_user_list(struct composite_context *ctx)
+static void cmd_list_groups_recv_group_list(struct composite_context *ctx)
 {
-	struct cmd_list_users_state *state = talloc_get_type(
-			ctx->async.private_data, struct cmd_list_users_state);
-	struct libnet_UserList *user_list;
+	struct cmd_list_groups_state *state = talloc_get_type(
+			ctx->async.private_data, struct cmd_list_groups_state);
+	struct libnet_GroupList *group_list;
 	NTSTATUS status;
 	int i;
 
-	DEBUG(5, ("cmd_list_users_recv_user_list called\n"));
+	DEBUG(5, ("cmd_list_groups_recv_group_list called\n"));
 
-	user_list = talloc(state, struct libnet_UserList);
-	if (composite_nomem(user_list, state->ctx)) return;
+	group_list = talloc(state, struct libnet_GroupList);
+	if (composite_nomem(group_list, state->ctx)) return;
 
-	status = libnet_UserList_recv(ctx, state, user_list);
+	status = libnet_GroupList_recv(ctx, state, group_list);
 
 	/* If NTSTATUS is neither OK nor MORE_ENTRIES, something broke */
 	if (!NT_STATUS_IS_OK(status) &&
@@ -141,51 +141,53 @@ static void cmd_list_users_recv_user_list(struct composite_context *ctx)
 		return;
 	}
 
-	for (i = 0; i < user_list->out.count; ++i) {
-		DEBUG(5, ("Appending user '%s'\n", user_list->out.users[i].username));
-		state->result = talloc_asprintf_append_buffer(state->result, "%s,",
-					user_list->out.users[i].username);
+	for (i = 0; i < group_list->out.count; ++i) {
+		DEBUG(5, ("Appending group '%s'\n",
+			  group_list->out.groups[i].groupname));
+		state->result = talloc_asprintf_append_buffer(state->result,
+					"%s,",
+					group_list->out.groups[i].groupname);
 	}
 
-	/* If the status is OK, we're finished, there's no more users.
+	/* If the status is OK, we're finished, there's no more groups.
 	 * So we'll trim off the trailing ',' and are done.*/
 	if (NT_STATUS_IS_OK(status)) {
 		int str_len = strlen(state->result);
-		DEBUG(5, ("list_UserList_recv returned NT_STATUS_OK\n"));
+		DEBUG(5, ("list_GroupList_recv returned NT_STATUS_OK\n"));
 		state->result[str_len - 1] = '\0';
 		composite_done(state->ctx);
 		return;
 	}
 
-	DEBUG(5, ("list_UserList_recv returned NT_STATUS_MORE_ENTRIES\n"));
+	DEBUG(5, ("list_GroupList_recv returned NT_STATUS_MORE_ENTRIES\n"));
 
-	/* Otherwise there's more users to get, so call out to libnet and
+	/* Otherwise there's more groups to get, so call out to libnet and
 	 * continue on this function here. */
 
-	user_list->in.domain_name = state->domain_name;
+	group_list->in.domain_name = state->domain_name;
 	/* See comment above about the page size. 128 seems like a good default.
 	 */
-	user_list->in.page_size = 128;
-	user_list->in.resume_index = user_list->out.resume_index;
+	group_list->in.page_size = 128;
+	group_list->in.resume_index = group_list->out.resume_index;
 
-	ctx = libnet_UserList_send(state->domain->libnet_ctx, state, user_list,
+	ctx = libnet_GroupList_send(state->domain->libnet_ctx, state,group_list,
 			NULL);
 
-	composite_continue(state->ctx, ctx, cmd_list_users_recv_user_list,
+	composite_continue(state->ctx, ctx, cmd_list_groups_recv_group_list,
 			state);
 }
 
-NTSTATUS wb_cmd_list_users_recv(struct composite_context *ctx,
+NTSTATUS wb_cmd_list_groups_recv(struct composite_context *ctx,
 		TALLOC_CTX *mem_ctx, uint32_t *extra_data_len,
 		char **extra_data)
 {
 	NTSTATUS status = composite_wait(ctx);
 
-	DEBUG(5, ("wb_cmd_list_users_recv called\n"));
+	DEBUG(5, ("wb_cmd_list_groups_recv called\n"));
 
 	if (NT_STATUS_IS_OK(status)) {
-		struct cmd_list_users_state *state = talloc_get_type(
-			ctx->private_data, struct cmd_list_users_state);
+		struct cmd_list_groups_state *state = talloc_get_type(
+			ctx->private_data, struct cmd_list_groups_state);
 
 		*extra_data_len = strlen(state->result);
 		*extra_data = talloc_steal(mem_ctx, state->result);
diff --git a/source4/winbind/wb_samba3_cmd.c b/source4/winbind/wb_samba3_cmd.c
index 6af9266..2c273e5 100644
--- a/source4/winbind/wb_samba3_cmd.c
+++ b/source4/winbind/wb_samba3_cmd.c
@@ -5,6 +5,7 @@
    Copyright (C) Stefan Metzmacher	2005
    Copyright (C) Volker Lendecke	2005
    Copyright (C) Andrew Bartlett <abartlet at samba.org> 2005
+   Copyright (C) Kai Blin		2009
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -679,6 +680,50 @@ static void list_trustdom_recv_doms(struct composite_context *ctx)
 	wbsrv_samba3_async_epilogue(status, s3call);
 }
 
+/* list groups */
+static void list_groups_recv(struct composite_context *ctx);
+
+NTSTATUS wbsrv_samba3_list_groups(struct wbsrv_samba3_call *s3call)
+{
+	struct composite_context *ctx;
+	struct wbsrv_service *service = s3call->wbconn->listen_socket->service;
+
+	DEBUG(5, ("wbsrv_samba4_list_groups called\n"));
+
+	ctx = wb_cmd_list_groups_send(s3call, service,
+				      s3call->request.domain_name);
+	NT_STATUS_HAVE_NO_MEMORY(ctx);
+
+	ctx->async.fn = list_groups_recv;
+	ctx->async.private_data = s3call;
+	s3call->flags |= WBSRV_CALL_FLAGS_REPLY_ASYNC;
+	return NT_STATUS_OK;
+}
+
+static void list_groups_recv(struct composite_context *ctx)
+{
+	struct wbsrv_samba3_call *s3call = talloc_get_type_abort(
+						ctx->async.private_data,
+						struct wbsrv_samba3_call);
+	uint32_t extra_data_len;
+	char *extra_data;
+	NTSTATUS status;
+
+	DEBUG(5, ("list_groups_recv called\n"));
+
+	status = wb_cmd_list_groups_recv(ctx, s3call, &extra_data_len,
+			&extra_data);
+
+	if (NT_STATUS_IS_OK(status)) {
+		s3call->response.extra_data.data = extra_data;
+		s3call->response.length += extra_data_len;
+		if (extra_data) {
+			s3call->response.length += 1;
+		}
+	}
+
+	wbsrv_samba3_async_epilogue(status, s3call);
+}
 
 /* List users */
 
diff --git a/source4/winbind/wb_samba3_protocol.c b/source4/winbind/wb_samba3_protocol.c
index 9a9765b..d40e0e6 100644
--- a/source4/winbind/wb_samba3_protocol.c
+++ b/source4/winbind/wb_samba3_protocol.c
@@ -117,6 +117,9 @@ NTSTATUS wbsrv_samba3_handle_call(struct wbsrv_samba3_call *s3call)
 	case WINBINDD_GETUSERSIDS:
 		return wbsrv_samba3_usersids(s3call);
 
+	case WINBINDD_LIST_GROUPS:
+		return wbsrv_samba3_list_groups(s3call);
+
 	case WINBINDD_LIST_TRUSTDOM:
 		return wbsrv_samba3_list_trustdom(s3call);
 
@@ -172,12 +175,11 @@ NTSTATUS wbsrv_samba3_handle_call(struct wbsrv_samba3_call *s3call)
 	case WINBINDD_DUAL_GID2SID:
 		return wbsrv_samba3_gid2sid(s3call);
 
-		/* Unimplemented commands */
+	/* Unimplemented commands */
 
 	case WINBINDD_PAM_CHAUTHTOK:
 	case WINBINDD_PAM_LOGOFF:
 	case WINBINDD_PAM_CHNG_PSWD_AUTH_CRAP:
-	case WINBINDD_LIST_GROUPS:
 	case WINBINDD_LOOKUPRIDS:
 	case WINBINDD_SIDS_TO_XIDS:
 	case WINBINDD_ALLOCATE_UID:


-- 
Samba Shared Repository


More information about the samba-cvs mailing list