[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