r22104: BUG 4439: Fix the object picket on x64 WIndopws XP/2003.
authorGerald Carter <jerry@samba.org>
Fri, 6 Apr 2007 18:52:30 +0000 (18:52 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:19:12 +0000 (12:19 -0500)
Enable the DsRoleGetPrimaryDomainInfo() server code.
Tested by Win2000/XP/2003/Vista (x86) and WinXP (x64)

source/include/rpc_ds.h
source/rpc_parse/parse_ds.c
source/rpc_server/srv_lsa_ds.c
source/rpc_server/srv_lsa_ds_nt.c

index bfe5179490c5203c9e6e438ca28913f9657d7d41..4ca49871f6db9c71bda53bdb18f7deb614ca852a 100644 (file)
@@ -44,6 +44,7 @@
 
 /* machine role */
 
+#define DSROLE_DOMAIN_MEMBER_WKS       1
 #define DSROLE_STANDALONE_SRV          2       
 #define DSROLE_DOMAIN_MEMBER_SRV       3
 #define DSROLE_BDC                     4
 typedef struct
 {
        uint16          machine_role;
-       uint16          unknown;                /* 0x6173 -- maybe just alignment? */
-       
-       uint32          flags;
-       
+       uint32          flags;  
        uint32          netbios_ptr;
        uint32          dnsname_ptr;
        uint32          forestname_ptr;
        
-       struct GUID     domain_guid;
-       
+       struct GUID     domain_guid;    
        UNISTR2 netbios_domain;
-
        UNISTR2 dns_domain;     /* our dns domain */
        UNISTR2 forest_domain;  /* root domain of the forest to which we belong */
 } DSROLE_PRIMARY_DOMAIN_INFO_BASIC;
index c6131452226bb433a58fb7c90f753ec72d6b11a0..61300f8a8d4d12afa22a353fcdfdc66252e39b63 100644 (file)
@@ -37,7 +37,7 @@ static BOOL ds_io_dominfobasic(const char *desc, DSROLE_PRIMARY_DOMAIN_INFO_BASI
                
        if ( !prs_uint16("machine_role", ps, depth, &p->machine_role) )
                return False;
-       if ( !prs_uint16("unknown", ps, depth, &p->unknown) )
+       if ( !prs_align(ps) )
                return False;
 
        if ( !prs_uint32("flags", ps, depth, &p->flags) )
index 1e75175c2cd822cf2d1d5346e965ac207d4b4068..db741a1b64a92dfae1b5b4c7f26cdd9c9e1fe5c0 100644 (file)
@@ -25,9 +25,7 @@
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
 
-#if 0  /* disabled */
 /*******************************************************************
- api_reg_open_entry
  ********************************************************************/
 
 static BOOL api_dsrole_get_primary_dominfo(pipes_struct *p)
@@ -41,18 +39,17 @@ static BOOL api_dsrole_get_primary_dominfo(pipes_struct *p)
        ZERO_STRUCT(r_u);
 
        /* grab the request */
-       if ( !ds_io_q_getprimdominfo("", data, 0, &q_u) )
+       if ( !ds_io_q_getprimdominfo("", &q_u, data, 0) )
                return False;
 
        /* construct reply. */
        r_u.status = _dsrole_get_primary_dominfo( p, &q_u, &r_u );
 
-       if ( !ds_io_r_getprimdominfo("", rdata, 0, &r_u) )
+       if ( !ds_io_r_getprimdominfo("", &r_u, rdata, 0) )
                return False;
 
        return True;
 }
-#endif
 
 /*******************************************************************
  stub functions for unimplemented RPC
@@ -70,12 +67,8 @@ static BOOL api_dsrole_stub( pipes_struct *p )
  array of \PIPE\lsass (new windows 2000 UUID)  operations
 ********************************************************************/
 static struct api_struct api_lsa_ds_cmds[] = {
-       { "DS_NOP",                     DS_NOP,                 api_dsrole_stub }
-
-#if 0  /* disabled due to breakage with viewing domain users and groups 
-          on a Samba PDC from win2k clients  --jerry CIFS 2003 */
+       { "DS_NOP",                     DS_NOP,                 api_dsrole_stub },
        { "DS_GETPRIMDOMINFO",          DS_GETPRIMDOMINFO,      api_dsrole_get_primary_dominfo  }
-#endif
 
 };
 
index b410af8dedf9e44e317df10a7dccec24a8c4a133..844a20eed425cd031bdaca3ef261582158a95478 100644 (file)
@@ -46,49 +46,54 @@ static NTSTATUS fill_dsrole_dominfo_basic(TALLOC_CTX *ctx, DSROLE_PRIMARY_DOMAIN
                return NT_STATUS_NO_MEMORY;
        }
 
-       get_mydnsdomname(dnsdomain);
-       strlower_m(dnsdomain);
-
        switch ( lp_server_role() ) {
                case ROLE_STANDALONE:
                        basic->machine_role = DSROLE_STANDALONE_SRV;
+                       basic->netbios_ptr = 1;
+                       netbios_domain = get_global_sam_name();
                        break;
                case ROLE_DOMAIN_MEMBER:
+                       basic->netbios_ptr = 1;
+                       netbios_domain = lp_workgroup();
                        basic->machine_role = DSROLE_DOMAIN_MEMBER_SRV;
                        break;
                case ROLE_DOMAIN_BDC:
+                       basic->netbios_ptr = 1;
+                       netbios_domain = get_global_sam_name();
                        basic->machine_role = DSROLE_BDC;
-                       basic->flags = DSROLE_PRIMARY_DS_RUNNING|DSROLE_PRIMARY_DS_MIXED_MODE;
-                       if ( secrets_fetch_domain_guid( lp_workgroup(), &basic->domain_guid ) )
-                               basic->flags |= DSROLE_PRIMARY_DOMAIN_GUID_PRESENT;
                        break;
                case ROLE_DOMAIN_PDC:
+                       basic->netbios_ptr = 1;
+                       netbios_domain = get_global_sam_name();
                        basic->machine_role = DSROLE_PDC;
-                       basic->flags = DSROLE_PRIMARY_DS_RUNNING|DSROLE_PRIMARY_DS_MIXED_MODE;
-                       if ( secrets_fetch_domain_guid( lp_workgroup(), &basic->domain_guid ) )
-                               basic->flags |= DSROLE_PRIMARY_DOMAIN_GUID_PRESENT;
                        break;
        }
 
-       basic->unknown = 0x6173;                /* seen on the wire; maybe padding */
-
        /* always set netbios name */
 
-       basic->netbios_ptr = 1;
-       netbios_domain = get_global_sam_name();
-       init_unistr2( &basic->netbios_domain, netbios_domain, UNI_FLAGS_NONE);
+       init_unistr2( &basic->netbios_domain, netbios_domain, UNI_STR_TERMINATE);
 
-       basic->dnsname_ptr = 1;
-       init_unistr2( &basic->dns_domain, dnsdomain, UNI_FLAGS_NONE);
-       basic->forestname_ptr = 1;
-       init_unistr2( &basic->forest_domain, dnsdomain, UNI_FLAGS_NONE);
-       
+       if ( secrets_fetch_domain_guid( lp_workgroup(), &basic->domain_guid ) )
+               basic->flags |= DSROLE_PRIMARY_DOMAIN_GUID_PRESENT;
 
        /* fill in some additional fields if we are a member of an AD domain */
 
-       if ( lp_security() == SEC_ADS ) {       
-               /* TODO */
-               ;;
+       if ( lp_security() == SEC_ADS ) {
+               fstrcpy( dnsdomain, lp_realm() );
+               strlower_m( dnsdomain );
+               
+               basic->dnsname_ptr = 1;
+               init_unistr2( &basic->dns_domain, dnsdomain, UNI_STR_TERMINATE);
+               basic->forestname_ptr = 1;
+               init_unistr2( &basic->forest_domain, dnsdomain, UNI_STR_TERMINATE);
+       } else {
+               get_mydnsdomname(dnsdomain);
+               strlower_m(dnsdomain);
+
+               basic->dnsname_ptr = 1;
+               init_unistr2( &basic->dns_domain, dnsdomain, UNI_FLAGS_NONE);
+               basic->forestname_ptr = 1;
+               init_unistr2( &basic->forest_domain, dnsdomain, UNI_FLAGS_NONE);
        }
 
        *info = basic;