The branch, master has been updated
       via  2ee3cca... s4:winbind - use "unsigned" variables where possible
       via  1310eba... s4:winbind/wb_cmd_getgroups.c - fix up warnings
       via  98bc10d... s4:unittest Fix unittest to reflect that wbinfo -r no 
longer fail
       via  bc766a9... s4:winbind: stub implementation of WINBINDD_PAM_LOGOFF
       via  238ff24... s4:winbind: Fix a misplaced returned info
       via  42b5b38... s4:winbind Implement logic for getgroups to work
       via  30baf31... s4:winbind: implement calls for allowing getent groups
       via  74166c3... s4:torture/rpc/netlogon.c - "LogonGetDomainInfo" test - 
make it compatible against Windows Server 2008
       via  9995a37... s4:netlogon RPC - "LogonGetDomainInfo" - make the call 
compatible with >= Windows 2008
       via  1deefca... libcli/auth/schannel_state_tdb.c - fix an obviously 
wrong error handling
      from  48cdca0... s4-smbtorture: fix uninitialized variable in winreg 
QueryValue call.

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


- Log -----------------------------------------------------------------
commit 2ee3cca4ffd60d091ca5fe8035f90969f6b91cc4
Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>
Date:   Tue Mar 9 17:54:12 2010 +0100

    s4:winbind - use "unsigned" variables where possible

commit 1310eba9705d6c49ec36555f546c4b99174ee695
Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>
Date:   Tue Mar 9 17:52:10 2010 +0100

    s4:winbind/wb_cmd_getgroups.c - fix up warnings
    
    Also fix some indentations.

commit 98bc10d0a8284387789fafc32a1a1e54a7e31824
Author: Matthieu Patou <m...@matws.net>
Date:   Tue Mar 9 15:35:54 2010 +0300

    s4:unittest Fix unittest to reflect that wbinfo -r no longer fail
    
    Signed-off-by: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>

commit bc766a9a8475344eb4556da91f68874523d1fe52
Author: Matthieu Patou <m...@matws.net>
Date:   Wed Mar 3 23:29:15 2010 +0300

    s4:winbind: stub implementation of WINBINDD_PAM_LOGOFF
    
    Signed-off-by: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>

commit 238ff24341767230614a3931646df59c1cf87a52
Author: Matthieu Patou <m...@matws.net>
Date:   Wed Mar 3 23:29:32 2010 +0300

    s4:winbind: Fix a misplaced returned info
    
    libwbclient expect to have in auth.exra_data the INFO3_TXT and in 
auth.unix_username the username
    
    Signed-off-by: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>

commit 42b5b381871dd935aeda34669a2c03a05a63f5f0
Author: Matthieu Patou <m...@matws.net>
Date:   Thu Mar 4 03:05:06 2010 +0300

    s4:winbind Implement logic for getgroups to work
    
    This function is called by the system everytime we do a id user or when we 
do wbinfo -r
    
    Signed-off-by: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>

commit 30baf31411363ebd79a6366caf4a792850c40192
Author: Matthieu Patou <m...@matws.net>
Date:   Thu Mar 4 02:46:36 2010 +0300

    s4:winbind: implement calls for allowing getent groups
    
    This is to say getgrent and setgrent, and the associated technical objects 
(states, build directives,...) needed.
    
    Signed-off-by: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>

commit 74166c380c5ad110d93c4e7141eaa7b1d069ced8
Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>
Date:   Wed Feb 17 09:51:41 2010 +0100

    s4:torture/rpc/netlogon.c - "LogonGetDomainInfo" test - make it compatible 
against Windows Server 2008
    
    This is a reworked version of the mentioned test which passes against 
Windows
    Server 2008. The previous version, also mainly written by me passed only 
against
    Windows Server <= 2003.

commit 9995a37a8cffb5e20e2b0ef5abfee602673d362d
Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>
Date:   Fri Mar 5 11:09:57 2010 +0100

    s4:netlogon RPC - "LogonGetDomainInfo" - make the call compatible with >= 
Windows 2008
    
    Add more security checks and other corrections to imitate Windows Server >= 
2008.

commit 1deefcaee1f3de97c0377b513a6f9c3d1181e2b0
Author: Matthias Dieter Wallnöfer <mwallnoe...@yahoo.de>
Date:   Tue Mar 9 17:12:02 2010 +0100

    libcli/auth/schannel_state_tdb.c - fix an obviously wrong error handling

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

Summary of changes:
 libcli/auth/schannel_state_tdb.c              |    1 -
 nsswitch/tests/test_wbinfo.sh                 |    3 +-
 source4/rpc_server/netlogon/dcerpc_netlogon.c |   85 +++++++---
 source4/torture/rpc/netlogon.c                |  118 +++++++++++--
 source4/winbind/config.mk                     |    3 +
 source4/winbind/wb_async_helpers.c            |   20 +-
 source4/winbind/wb_cmd_getgrent.c             |  124 ++++++++++++++
 source4/winbind/wb_cmd_getgroups.c            |  223 +++++++++++++++++++++++++
 source4/winbind/wb_cmd_list_trustdom.c        |    8 +-
 source4/winbind/wb_cmd_setgrent.c             |  171 +++++++++++++++++++
 source4/winbind/wb_cmd_userdomgroups.c        |    8 +-
 source4/winbind/wb_cmd_usersids.c             |   12 +-
 source4/winbind/wb_samba3_cmd.c               |  151 ++++++++++++++++-
 source4/winbind/wb_samba3_protocol.c          |    5 +-
 source4/winbind/wb_server.h                   |   13 ++
 15 files changed, 866 insertions(+), 79 deletions(-)
 create mode 100644 source4/winbind/wb_cmd_getgrent.c
 create mode 100644 source4/winbind/wb_cmd_getgroups.c
 create mode 100644 source4/winbind/wb_cmd_setgrent.c


Changeset truncated at 500 lines:

diff --git a/libcli/auth/schannel_state_tdb.c b/libcli/auth/schannel_state_tdb.c
index 0ec928f..d1e5ed0 100644
--- a/libcli/auth/schannel_state_tdb.c
+++ b/libcli/auth/schannel_state_tdb.c
@@ -340,7 +340,6 @@ NTSTATUS schannel_check_creds_state(TALLOC_CTX *mem_ctx,
 
        ret = tdb_transaction_start(tdb_sc->tdb);
        if (ret != 0) {
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
                status = NT_STATUS_INTERNAL_DB_CORRUPTION;
                goto done;
        }
diff --git a/nsswitch/tests/test_wbinfo.sh b/nsswitch/tests/test_wbinfo.sh
index 8d8f116..b92b8f0 100755
--- a/nsswitch/tests/test_wbinfo.sh
+++ b/nsswitch/tests/test_wbinfo.sh
@@ -178,7 +178,8 @@ 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 -r against $TARGET" $wbinfo -r "$DOMAIN/$USERNAME" || 
failed=`expr $failed + 1`
 
 testit "wbinfo --user-domgroups against $TARGET" $wbinfo --user-domgroups 
$admin_sid || failed=`expr $failed + 1`
 
diff --git a/source4/rpc_server/netlogon/dcerpc_netlogon.c 
b/source4/rpc_server/netlogon/dcerpc_netlogon.c
index 563ed5e..e82158f 100644
--- a/source4/rpc_server/netlogon/dcerpc_netlogon.c
+++ b/source4/rpc_server/netlogon/dcerpc_netlogon.c
@@ -1148,16 +1148,18 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct 
dcesrv_call_state *dce_cal
                "securityIdentifier", "trustPartner", NULL };
        const char * const attrs2[] = { "dNSHostName",
                "msDS-SupportedEncryptionTypes", NULL };
-       const char *temp_str;
+       const char * const attrs3[] = { NULL };
+       const char *temp_str, *temp_str2;
        const char *old_dns_hostname;
        struct ldb_context *sam_ctx;
-       struct ldb_message **res1, **res2, **res3, *new_msg;
+       struct ldb_message **res0, **res1, **res2, **res3, *new_msg;
        struct ldb_dn *workstation_dn;
        struct netr_DomainInformation *domain_info;
        struct netr_LsaPolicyInformation *lsa_policy_info;
        struct netr_OsVersionInfoEx *os_version;
        uint32_t default_supported_enc_types = 0xFFFFFFFF;
-       int ret1, ret2, ret3, i;
+       bool update_dns_hostname = true;
+       int ret, ret3, i;
        NTSTATUS status;
 
        status = dcesrv_netr_creds_server_step_check(dce_call,
@@ -1181,27 +1183,59 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct 
dcesrv_call_state *dce_cal
        switch (r->in.level) {
        case 1: /* Domain information */
 
-               /* TODO: check NTSTATUS results - and fail also on SAMDB
-                * errors (needs some testing against Windows Server 2008) */
+               /*
+                * Updates the DNS hostname when the client wishes that the
+                * server should handle this for him
+                * ("NETR_WS_FLAG_HANDLES_SPN_UPDATE" not set).
+                * See MS-NRPC section 3.5.4.3.9
+                */
+               if ((r->in.query->workstation_info->workstation_flags
+                   & NETR_WS_FLAG_HANDLES_SPN_UPDATE) != 0) {
+                       update_dns_hostname = false;
+               }
 
                /*
-                * Check that the computer name parameter matches as prefix with
-                * the DNS hostname in the workstation info structure.
+                * Checks that the computer name parameter without possible "$"
+                * matches as prefix with the DNS hostname in the workstation
+                * info structure.
                 */
-               temp_str = strndup(r->in.query->workstation_info->dns_hostname,
-                       strcspn(r->in.query->workstation_info->dns_hostname,
-                       "."));
-               if (strcasecmp(r->in.computer_name, temp_str) != 0)
-                       return NT_STATUS_INVALID_PARAMETER;
+               temp_str = talloc_strndup(mem_ctx,
+                                         r->in.computer_name,
+                                         strcspn(r->in.computer_name, "$"));
+               NT_STATUS_HAVE_NO_MEMORY(temp_str);
+               temp_str2 = talloc_strndup(mem_ctx,
+                                          
r->in.query->workstation_info->dns_hostname,
+                                          
strcspn(r->in.query->workstation_info->dns_hostname, "."));
+               NT_STATUS_HAVE_NO_MEMORY(temp_str2);
+               if (strcasecmp(temp_str, temp_str2) != 0) {
+                       update_dns_hostname = false;
+               }
+
+               /*
+                * Check that the DNS hostname when it should be updated
+                * will be used only by maximum one host.
+                */
+               ret = gendb_search(sam_ctx, mem_ctx, samdb_base_dn(sam_ctx),
+                                  &res0, attrs3, "(dNSHostName=%s)",
+                                  r->in.query->workstation_info->dns_hostname);
+               if (ret < 0) {
+                       return NT_STATUS_INTERNAL_DB_CORRUPTION;
+               }
+               if (ret >= 1) {
+                       update_dns_hostname = false;
+               }
+
+               talloc_free(res0);
 
+               /* Prepare the workstation DN */
                workstation_dn = ldb_dn_new_fmt(mem_ctx, sam_ctx, "<SID=%s>",
                        dom_sid_string(mem_ctx, creds->sid));
                NT_STATUS_HAVE_NO_MEMORY(workstation_dn);
 
                /* Lookup for attributes in workstation object */
-               ret1 = gendb_search_dn(sam_ctx, mem_ctx, workstation_dn,
+               ret = gendb_search_dn(sam_ctx, mem_ctx, workstation_dn,
                        &res1, attrs2);
-               if (ret1 != 1) {
+               if (ret != 1) {
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                }
 
@@ -1260,13 +1294,10 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct 
dcesrv_call_state *dce_cal
                }
 
                /*
-                * Updates the "dNSHostname" and the "servicePrincipalName"s
-                * since the client wishes that the server should handle this
-                * for him ("NETR_WS_FLAG_HANDLES_SPN_UPDATE" not set).
-                * See MS-NRPC section 3.5.4.3.9
+                * If the boolean "update_dns_hostname" remained true, then we
+                * are fine to start the update.
                 */
-               if ((r->in.query->workstation_info->workstation_flags
-                       & NETR_WS_FLAG_HANDLES_SPN_UPDATE) == 0) {
+               if (update_dns_hostname) {
                        samdb_msg_set_string(sam_ctx, mem_ctx, new_msg,
                                "dNSHostname",
                        r->in.query->workstation_info->dns_hostname);
@@ -1297,9 +1328,9 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct 
dcesrv_call_state *dce_cal
                   primary domain is also a "trusted" domain, so we need to
                   put the primary domain into the lists of returned trusts as
                   well. */
-               ret2 = gendb_search_dn(sam_ctx, mem_ctx, samdb_base_dn(sam_ctx),
+               ret = gendb_search_dn(sam_ctx, mem_ctx, samdb_base_dn(sam_ctx),
                        &res2, attrs);
-               if (ret2 != 1) {
+               if (ret != 1) {
                        return NT_STATUS_INTERNAL_DB_CORRUPTION;
                }
 
@@ -1356,7 +1387,15 @@ static NTSTATUS dcesrv_netr_LogonGetDomainInfo(struct 
dcesrv_call_state *dce_cal
 
                domain_info->lsa_policy = *lsa_policy_info;
 
-               domain_info->dns_hostname.string = old_dns_hostname;
+               /* The DNS hostname is only returned back when there is a chance
+                * for a change. */
+               if ((r->in.query->workstation_info->workstation_flags
+                   & NETR_WS_FLAG_HANDLES_SPN_UPDATE) != 0) {
+                       domain_info->dns_hostname.string = old_dns_hostname;
+               } else {
+                       domain_info->dns_hostname.string = NULL;
+               }
+
                domain_info->workstation_flags =
                        r->in.query->workstation_info->workstation_flags;
 
diff --git a/source4/torture/rpc/netlogon.c b/source4/torture/rpc/netlogon.c
index c7bfb94..c2ff86d 100644
--- a/source4/torture/rpc/netlogon.c
+++ b/source4/torture/rpc/netlogon.c
@@ -6,7 +6,7 @@
    Copyright (C) Andrew Tridgell 2003
    Copyright (C) Andrew Bartlett <abart...@samba.org> 2003-2004
    Copyright (C) Tim Potter      2003
-   Copyright (C) Matthias Dieter Wallnöfer            2009
+   Copyright (C) Matthias Dieter Wallnöfer            2009-2010
    
    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
@@ -37,7 +37,6 @@
 #include "lib/ldb_wrap.h"
 
 #define TEST_MACHINE_NAME "torturetest"
-#define TEST_MACHINE_DNS_SUFFIX "torturedomain"
 
 static bool test_LogonUasLogon(struct torture_context *tctx, 
                               struct dcerpc_pipe *p)
@@ -2394,7 +2393,7 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
 
        ZERO_STRUCT(q1);
        q1.dns_hostname = talloc_asprintf(tctx, "%s.%s", TEST_MACHINE_NAME,
-               TEST_MACHINE_DNS_SUFFIX);
+               lp_dnsdomain(tctx->lp_ctx));
        q1.sitename = "Default-First-Site-Name";
        q1.os_version.os = &os;
        q1.os_name.string = talloc_asprintf(tctx,
@@ -2497,19 +2496,20 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
                "Out 'workstation flags' don't match!");
 
 
-       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 2nd call 
(variation of DNS hostname)\n");
+       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 2nd call 
(variation of DNS hostname doesn't work)\n");
        netlogon_creds_client_authenticator(creds, &a);
 
        /* Wipe out the osVersion, and prove which values still 'stick' */
        q1.os_version.os = NULL;
 
        /* Change also the DNS hostname to test differences in behaviour */
-       q1.dns_hostname = talloc_asprintf(tctx, "%s.newdomain",
-               TEST_MACHINE_NAME);
+       talloc_free(discard_const_p(char, q1.dns_hostname));
+       q1.dns_hostname = talloc_asprintf(tctx, "%s2.%s", TEST_MACHINE_NAME,
+               lp_dnsdomain(tctx->lp_ctx));
 
-       /* Let the DC handle the "servicePrincipalName" and DNS hostname
+       /* The workstation handles the "servicePrincipalName" and DNS hostname
           updates */
-       q1.workstation_flags = 0;
+       q1.workstation_flags = NETR_WS_FLAG_HANDLES_SPN_UPDATE;
 
        status = dcerpc_netr_LogonGetDomainInfo(p, tctx, &r);
        torture_assert_ntstatus_ok(tctx, status, "netr_LogonGetDomainInfo");
@@ -2522,6 +2522,7 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
                ret = gendb_search(sam_ctx, tctx, NULL, &res, attrs,
                                   "(sAMAccountName=%s$)", TEST_MACHINE_NAME);
                torture_assert(tctx, ret == 1, "Test machine account not found 
in SAMDB on DC! Has the workstation been joined?");
+
                torture_assert_str_equal(tctx,
                                         ldb_msg_find_attr_as_string(res[0], 
"operatingSystem", NULL),
                                         q1.os_name.string, "'operatingSystem' 
should stick!");
@@ -2531,13 +2532,14 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
                torture_assert(tctx,
                               ldb_msg_find_attr_as_string(res[0], 
"operatingSystemVersion", NULL) == NULL,
                               "'operatingSystemVersion' shouldn't stick!");
-               
-               /* The DNS host name should have been updated now by the server 
*/
+
+               /* The DNS host name shouldn't have been updated by the server 
*/
+
                torture_assert_str_equal(tctx,
                                         ldb_msg_find_attr_as_string(res[0], 
"dNSHostName", NULL),
-                                        q1.dns_hostname, "'DNS host name' 
didn't change!");
+                                        old_dnsname, "'DNS host name' did 
change!");
                
-               /* Find the two "servicePrincipalName"s which the DC should 
have been
+               /* Find the two "servicePrincipalName"s which the DC shouldn't 
have been
                   updated (HOST/<Netbios name> and HOST/<FQDN name>) - see 
MS-NRPC
                   3.5.4.3.9 */
                spn_el = ldb_msg_find_element(res[0], "servicePrincipalName");
@@ -2545,13 +2547,13 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
                               "There should exist 'servicePrincipalName's in 
AD!");
                temp_str = talloc_asprintf(tctx, "HOST/%s", TEST_MACHINE_NAME);
                for (i=0; i < spn_el->num_values; i++)
-                       if (strcmp((char *) spn_el->values[i].data, temp_str) 
== 0)
+                       if (strcasecmp((char *) spn_el->values[i].data, 
temp_str) == 0)
                                break;
                torture_assert(tctx, i != spn_el->num_values,
                               "'servicePrincipalName' HOST/<Netbios name> not 
found!");
-               temp_str = talloc_asprintf(tctx, "HOST/%s", q1.dns_hostname);
+               temp_str = talloc_asprintf(tctx, "HOST/%s", old_dnsname);
                for (i=0; i < spn_el->num_values; i++)
-                       if (strcmp((char *) spn_el->values[i].data, temp_str) 
== 0)
+                       if (strcasecmp((char *) spn_el->values[i].data, 
temp_str) == 0)
                                break;
                torture_assert(tctx, i != spn_el->num_values,
                               "'servicePrincipalName' HOST/<FQDN name> not 
found!");
@@ -2563,13 +2565,93 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
 
        /* Checks "workstation flags" */
        torture_assert(tctx,
+               info.domain_info->workstation_flags == 
NETR_WS_FLAG_HANDLES_SPN_UPDATE,
+               "Out 'workstation flags' don't match!");
+
+
+       /* Now try the same but the workstation flags set to 0 */
+
+       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 3rd call 
(variation of DNS hostname doesn't work)\n");
+       netlogon_creds_client_authenticator(creds, &a);
+
+       /* Change also the DNS hostname to test differences in behaviour */
+       talloc_free(discard_const_p(char, q1.dns_hostname));
+       q1.dns_hostname = talloc_asprintf(tctx, "%s2.%s", TEST_MACHINE_NAME,
+               lp_dnsdomain(tctx->lp_ctx));
+
+       /* Wipe out the osVersion, and prove which values still 'stick' */
+       q1.os_version.os = NULL;
+
+       /* Let the DC handle the "servicePrincipalName" and DNS hostname
+          updates */
+       q1.workstation_flags = 0;
+
+       status = dcerpc_netr_LogonGetDomainInfo(p, tctx, &r);
+       torture_assert_ntstatus_ok(tctx, status, "netr_LogonGetDomainInfo");
+       torture_assert(tctx, netlogon_creds_client_check(creds, &a.cred), 
"Credential chaining failed");
+
+       msleep(250);
+
+       if (sam_ctx) {
+               /* AD workstation infos entry check */
+               ret = gendb_search(sam_ctx, tctx, NULL, &res, attrs,
+                                  "(sAMAccountName=%s$)", TEST_MACHINE_NAME);
+               torture_assert(tctx, ret == 1, "Test machine account not found 
in SAMDB on DC! Has the workstation been joined?");
+
+               torture_assert_str_equal(tctx,
+                                        ldb_msg_find_attr_as_string(res[0], 
"operatingSystem", NULL),
+                                        q1.os_name.string, "'operatingSystem' 
should stick!");
+               torture_assert(tctx,
+                              ldb_msg_find_attr_as_string(res[0], 
"operatingSystemServicePack", NULL) == NULL,
+                              "'operatingSystemServicePack' shouldn't stick!");
+               torture_assert(tctx,
+                              ldb_msg_find_attr_as_string(res[0], 
"operatingSystemVersion", NULL) == NULL,
+                              "'operatingSystemVersion' shouldn't stick!");
+
+               /* The DNS host name shouldn't have been updated by the server 
*/
+
+               torture_assert_str_equal(tctx,
+                                        ldb_msg_find_attr_as_string(res[0], 
"dNSHostName", NULL),
+                                        old_dnsname, "'DNS host name' did 
change!");
+
+               /* Find the two "servicePrincipalName"s which the DC shouldn't 
have been
+                  updated (HOST/<Netbios name> and HOST/<FQDN name>) - see 
MS-NRPC
+                  3.5.4.3.9 */
+               spn_el = ldb_msg_find_element(res[0], "servicePrincipalName");
+               torture_assert(tctx, spn_el != NULL,
+                              "There should exist 'servicePrincipalName's in 
AD!");
+               temp_str = talloc_asprintf(tctx, "HOST/%s", TEST_MACHINE_NAME);
+               for (i=0; i < spn_el->num_values; i++)
+                       if (strcasecmp((char *) spn_el->values[i].data, 
temp_str) == 0)
+                               break;
+               torture_assert(tctx, i != spn_el->num_values,
+                              "'servicePrincipalName' HOST/<Netbios name> not 
found!");
+               temp_str = talloc_asprintf(tctx, "HOST/%s", old_dnsname);
+               for (i=0; i < spn_el->num_values; i++)
+                       if (strcasecmp((char *) spn_el->values[i].data, 
temp_str) == 0)
+                               break;
+               torture_assert(tctx, i != spn_el->num_values,
+                              "'servicePrincipalName' HOST/<FQDN name> not 
found!");
+
+               /* Here the server gives us NULL as the out DNS hostname */
+               torture_assert(tctx, info.domain_info->dns_hostname.string == 
NULL,
+                              "Out 'DNS hostname' should be NULL!");
+       }
+
+       /* Checks "workstation flags" */
+       torture_assert(tctx,
                info.domain_info->workstation_flags == 0,
                "Out 'workstation flags' don't match!");
 
 
-       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 3rd call 
(verification of DNS hostname and check for trusted domains)\n");
+       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 4th call 
(verification of DNS hostname and check for trusted domains)\n");
        netlogon_creds_client_authenticator(creds, &a);
 
+       /* Put the DNS hostname back */
+       talloc_free(discard_const_p(char, q1.dns_hostname));
+       q1.dns_hostname = talloc_asprintf(tctx, "%s.%s", TEST_MACHINE_NAME,
+               lp_dnsdomain(tctx->lp_ctx));
+
        /* The workstation handles the "servicePrincipalName" and DNS hostname
           updates */
        q1.workstation_flags = NETR_WS_FLAG_HANDLES_SPN_UPDATE;
@@ -2599,7 +2681,7 @@ static bool test_GetDomainInfo(struct torture_context 
*tctx,
                "Trusted domains have been requested!");
 
 
-       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 4th call (check 
for trusted domains)\n");
+       torture_comment(tctx, "Testing netr_LogonGetDomainInfo 5th call (check 
for trusted domains)\n");
        netlogon_creds_client_authenticator(creds, &a);
 
        /* The workstation handles the "servicePrincipalName" and DNS hostname
@@ -2664,7 +2746,7 @@ static bool test_GetDomainInfo_async(struct 
torture_context *tctx,
 
        ZERO_STRUCT(q1);
        q1.dns_hostname = talloc_asprintf(tctx, "%s.%s", TEST_MACHINE_NAME,
-               TEST_MACHINE_DNS_SUFFIX);
+               lp_dnsdomain(tctx->lp_ctx));
        q1.sitename = "Default-First-Site-Name";
        q1.os_name.string = "UNIX/Linux or similar";
 
diff --git a/source4/winbind/config.mk b/source4/winbind/config.mk
index 17cbd95..0bee89c 100644
--- a/source4/winbind/config.mk
+++ b/source4/winbind/config.mk
@@ -50,6 +50,9 @@ WINBIND_OBJ_FILES = $(addprefix $(winbindsrcdir)/, \
                wb_cmd_list_users.o \
                wb_cmd_setpwent.o \
                wb_cmd_getpwent.o \
+               wb_cmd_getgrent.o \
+               wb_cmd_setgrent.o \
+               wb_cmd_getgroups.o \
                wb_pam_auth.o \
                wb_sam_logon.o)
 
diff --git a/source4/winbind/wb_async_helpers.c 
b/source4/winbind/wb_async_helpers.c
index f23e05d..6eced45 100644
--- a/source4/winbind/wb_async_helpers.c
+++ b/source4/winbind/wb_async_helpers.c
@@ -31,7 +31,7 @@
 
 struct lsa_lookupsids_state {
        struct composite_context *ctx;
-       int num_sids;
+       uint32_t num_sids;
        struct lsa_LookupSids r;
        struct lsa_SidArray sids;
        struct lsa_TransNameArray names;
@@ -45,13 +45,13 @@ static void lsa_lookupsids_recv_names(struct rpc_request 
*req);
 struct composite_context *wb_lsa_lookupsids_send(TALLOC_CTX *mem_ctx,
                                                 struct dcerpc_pipe *lsa_pipe,
                                                 struct policy_handle *handle,
-                                                int num_sids,
+                                                uint32_t num_sids,
                                                 const struct dom_sid **sids)
 {
        struct composite_context *result;
        struct rpc_request *req;
        struct lsa_lookupsids_state *state;
-       int i;
+       uint32_t i;
 
        result = composite_create(mem_ctx, lsa_pipe->conn->event_ctx);
        if (result == NULL) goto failed;
@@ -105,7 +105,7 @@ static void lsa_lookupsids_recv_names(struct rpc_request 
*req)
        struct lsa_lookupsids_state *state =
                talloc_get_type(req->async.private_data,
                                struct lsa_lookupsids_state);
-       int i;
+       uint32_t i;
 
        state->ctx->status = dcerpc_lsa_LookupSids_recv(req);
        if (!composite_is_ok(state->ctx)) return;
@@ -194,7 +194,7 @@ static void lsa_lookupnames_recv_sids(struct rpc_request 
*req);
 struct composite_context *wb_lsa_lookupnames_send(TALLOC_CTX *mem_ctx,
                                                  struct dcerpc_pipe *lsa_pipe,
                                                  struct policy_handle *handle,
-                                                 int num_names,
+                                                 uint32_t num_names,
                                                  const char **names)
 {
        struct composite_context *result;
@@ -202,7 +202,7 @@ struct composite_context 
*wb_lsa_lookupnames_send(TALLOC_CTX *mem_ctx,
        struct lsa_lookupnames_state *state;
 
        struct lsa_String *lsa_names;
-       int i;
+       uint32_t i;
 
        result = composite_create(mem_ctx, lsa_pipe->conn->event_ctx);
        if (result == NULL) goto failed;
@@ -254,7 +254,7 @@ static void lsa_lookupnames_recv_sids(struct rpc_request 
*req)
        struct lsa_lookupnames_state *state =
                talloc_get_type(req->async.private_data,
                                struct lsa_lookupnames_state);
-       int i;
+       uint32_t i;
 
        state->ctx->status = dcerpc_lsa_LookupNames_recv(req);
        if (!composite_is_ok(state->ctx)) return;
@@ -316,7 +316,7 @@ struct samr_getuserdomgroups_state {
        struct composite_context *ctx;
        struct dcerpc_pipe *samr_pipe;
 
-       int num_rids;
+       uint32_t num_rids;
        uint32_t *rids;
 
        struct samr_RidWithAttributeArray *rid_array;
@@ -425,13 +425,13 @@ static void samr_usergroups_recv_close(struct rpc_request 
*req)
 
 NTSTATUS wb_samr_userdomgroups_recv(struct composite_context *ctx,
                                    TALLOC_CTX *mem_ctx,
-                                   int *num_rids, uint32_t **rids)
+                                   uint32_t *num_rids, uint32_t **rids)
 {
         struct samr_getuserdomgroups_state *state =
                 talloc_get_type(ctx->private_data,
                                 struct samr_getuserdomgroups_state);
 
-       int i;
+       uint32_t i;
        NTSTATUS status = composite_wait(ctx);
        if (!NT_STATUS_IS_OK(status)) goto done;
 
diff --git a/source4/winbind/wb_cmd_getgrent.c 
b/source4/winbind/wb_cmd_getgrent.c
new file mode 100644
index 0000000..79a3aff
--- /dev/null
+++ b/source4/winbind/wb_cmd_getgrent.c
@@ -0,0 +1,124 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Command backend for getgrent
+
+   Copyright (C) Matthieu Patou 2010
+
+   This program is free software; you can redistribute it and/or modify


-- 
Samba Shared Repository

Reply via email to