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 <[email protected]>
Date:   Thu Jan 15 10:14:55 2009 +0100

    s4-winbind: Add support for the WINBINDD_LIST_GROUPS command.

commit ec93fd6b0ccec34c109958137517d8c131033cd7
Author: Kai Blin <[email protected]>
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 <[email protected]> 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

Reply via email to