Removed global_myworkgroup, global_myname, global_myscope. Added liberal
[samba.git] / source3 / nmbd / nmbd_processlogon.c
index 23e4f935cabdbd8612ef42c58c3ede89c7d78255..6f2517f39f4d74339f8d8a62f61ba157de3701be 100644 (file)
@@ -4,6 +4,8 @@
    Copyright (C) Andrew Tridgell 1994-1998
    Copyright (C) Luke Kenneth Casson Leighton 1994-1998
    Copyright (C) Jeremy Allison 1994-1998
+   Copyright (C) Jim McDonough 2002
+   Copyright (C) Anthony Liguori 2002
    
    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
@@ -25,9 +27,6 @@
 
 #include "includes.h"
 
-extern pstring global_myname;
-extern fstring global_myworkgroup;
-
 struct sam_database_info {
         uint32 index;
         uint32 serial_lo, serial_hi;
@@ -91,8 +90,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
     return;
   }
 
-  pstrcpy(my_name, global_myname);
-  strupper(my_name);
+  pstrcpy(my_name, global_myname());
 
   code = SVAL(buf,0);
   DEBUG(1,("process_logon_packet: Logon from %s: code = 0x%x\n", inet_ntoa(p->ip), code));
@@ -129,7 +127,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       send_mailslot(True, getdc, 
                     outbuf,PTR_DIFF(q,outbuf),
-                   global_myname, 0x0,
+                   global_myname(), 0x0,
                                        machine,
                     dgram->source_name.name_type,
                     p->ip, *iface_ip(p->ip), p->port);  
@@ -196,7 +194,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
         q = ALIGN2(q, outbuf);
 
         q += dos_PutUniCode(q, my_name, sizeof(pstring), True); /* PDC name */
-        q += dos_PutUniCode(q, global_myworkgroup,sizeof(pstring), True); /* Domain name*/
+        q += dos_PutUniCode(q, lp_workgroup(),sizeof(pstring), True); /* Domain name*/
         SIVAL(q, 0, 1); /* our nt version */
         SSVAL(q, 4, 0xffff); /* our lmnttoken */
         SSVAL(q, 6, 0xffff); /* our lm20token */
@@ -207,7 +205,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       DEBUG(3,("process_logon_packet: GETDC request from %s at IP %s, \
 reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
-            machine,inet_ntoa(p->ip), reply_name, global_myworkgroup,
+            machine,inet_ntoa(p->ip), reply_name, lp_workgroup(),
             QUERYFORPDC_R, (uint32)ntversion, (uint32)lmnttoken,
             (uint32)lm20token ));
 
@@ -215,7 +213,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
 
       send_mailslot(True, getdc,
                   outbuf,PTR_DIFF(q,outbuf),
-                   global_myname, 0x0,
+                   global_myname(), 0x0,
                   dgram->source_name.name,
                   dgram->source_name.name_type,
                   p->ip, *iface_ip(p->ip), p->port);  
@@ -278,25 +276,115 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
       fstrcpy(reply_name+2,my_name); 
 
       DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
-              asccomp,inet_ntoa(p->ip), ascuser, reply_name, global_myworkgroup,
+              asccomp,inet_ntoa(p->ip), ascuser, reply_name, lp_workgroup(),
               SAMLOGON_R ,lmnttoken));
 
       /* Construct reply. */
 
       q = outbuf;
-      if (SVAL(uniuser, 0) == 0) {
-             SSVAL(q, 0, SAMLOGON_UNK_R);      /* user unknown */
-      }        else {
-             SSVAL(q, 0, SAMLOGON_R);
-      }
-      q += 2;
-
-      q += dos_PutUniCode(q, reply_name,sizeof(pstring), True);
-      q += dos_PutUniCode(q, ascuser, sizeof(pstring), True);
-      q += dos_PutUniCode(q, global_myworkgroup,sizeof(pstring), True);
+      /* we want the simple version unless we are an ADS PDC..which means  */
+      /* never, at least for now */
+      if ((ntversion < 11) || (SEC_ADS != lp_security()) || (ROLE_DOMAIN_PDC != lp_server_role())) {
+       if (SVAL(uniuser, 0) == 0) {
+         SSVAL(q, 0, SAMLOGON_UNK_R);  /* user unknown */
+       } else {
+         SSVAL(q, 0, SAMLOGON_R);
+       }
+
+       q += 2;
+
+       q += dos_PutUniCode(q, reply_name,sizeof(pstring), True);
+       q += dos_PutUniCode(q, ascuser, sizeof(pstring), True);
+       q += dos_PutUniCode(q, lp_workgroup(),sizeof(pstring), True);
+      } 
+#ifdef HAVE_ADS
+      else {
+       GUID domain_guid;
+       pstring domain;
+       char *component, *dc, *q1;
+       uint8 size;
+
+       safe_strcpy(domain, lp_realm(), sizeof(domain));
+       
+       if (SVAL(uniuser, 0) == 0) {
+         SSVAL(q, 0, SAMLOGON_AD_UNK_R);       /* user unknown */
+       } else {
+         SSVAL(q, 0, SAMLOGON_AD_R);
+       }
+       q += 2;
+
+       SSVAL(q, 0, 0);
+       q += 2;
+       SIVAL(q, 0, ADS_PDC|ADS_GC|ADS_LDAP|ADS_DS|
+                   ADS_KDC|ADS_TIMESERV|ADS_CLOSEST|ADS_WRITABLE);
+       q += 4;
+
+       /* Push Domain GUID */
+       if (False == secrets_fetch_domain_guid(domain, &domain_guid)) {
+         DEBUG(2, ("Could not fetch DomainGUID for %s\n", domain));
+         return;
+       }
+       memcpy(q, &domain_guid, sizeof(domain_guid));
+       q += sizeof(domain_guid);
+
+       /* Push domain components */
+       dc = domain;
+       q1 = q;
+       while ((component = strtok(dc, "."))) {
+         dc = NULL;
+         size = push_ascii(&q[1], component, -1, 0);
+         SCVAL(q, 0, size);
+         q += (size + 1);
+       }
+       SCVAL(q, 0, 0); q++;
+       SSVAL(q, 0, 0x18c0); /* not sure what this is for, but  */
+       q += 2;              /* it must follow the domain name. */
+
+       /* Push dns host name */
+       size = push_ascii(&q[1], global_myname(), -1, 0);
+       SCVAL(q, 0, size);
+       q += (size + 1);
+       SSVAL(q, 0, 0x18c0); /* not sure what this is for, but  */
+       q += 2;              /* it must follow the domain name. */
+
+       /* Push NETBIOS of domain */
+       size = push_ascii(&q[1], domain, -1, STR_UPPER);
+       SCVAL(q, 0, size);
+       q += (size + 1);
+       SCVAL(q, 0, 0); q++; /* is this a null terminator or empty field */
+       /* null terminator would not be needed because size is included */
+
+       /* Push NETBIOS of hostname */
+       size = push_ascii(&q[1], my_name, -1, 0);
+       SCVAL(q, 0, size);
+       q += (size + 1);
+       SCVAL(q, 0, 0); q++; /* null terminator or empty field? */
+
+       /* Push user account */
+       size = push_ascii(&q[1], ascuser, -1, 0);
+       SCVAL(q, 0, size);
+       q += (size + 1);
+
+       /* Push 'Default-First-Site-Name' */
+       size = push_ascii(&q[1], "Default-First-Site-Name", -1, 0);
+       SCVAL(q, 0, size);
+       q += (size + 1);
+
+       SSVAL(q, 0, 0xc000); /* unknown */
+       SCVAL(q, 2, PTR_DIFF(q,q1));
+       SCVAL(q, 3, 0x10); /* unknown */
+       q += 4;
+
+       SIVAL(q, 0, 0x00000002); q += 4; /* unknown */
+       SIVAL(q, 0, (iface_ip(p->ip))->s_addr); q += 4;
+       SIVAL(q, 0, 0x00000000); q += 4; /* unknown */
+       SIVAL(q, 0, 0x00000000); q += 4; /* unknown */
+      }        
+#endif
 
       /* tell the client what version we are */
-      SIVAL(q, 0, 1); /* our ntversion */
+      SIVAL(q, 0, ((ntversion < 11) || (SEC_ADS != lp_security())) ? 1 : 13); 
+      /* our ntversion */
       SSVAL(q, 4, 0xffff); /* our lmnttoken */ 
       SSVAL(q, 6, 0xffff); /* our lm20token */
       q += 8;
@@ -305,7 +393,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
 
       send_mailslot(True, getdc,
                    outbuf,PTR_DIFF(q,outbuf),
-                   global_myname, 0x0,
+                   global_myname(), 0x0,
                    dgram->source_name.name,
                    dgram->source_name.name_type,
                    p->ip, *iface_ip(p->ip), p->port);