first pass at updating head branch to be to be the same as the SAMBA_2_0 branch
[nivanova/samba-autobuild/.git] / source / nmbd / nmbd_processlogon.c
index bc9fcb59218c1c8b6c137dafa2d7e019e05d736b..279ab1c764fb05a6eb11581f30346b7948bbbe2d 100644 (file)
@@ -28,8 +28,8 @@
 
 extern int DEBUGLEVEL;
 
-extern pstring myname;
-extern fstring myworkgroup;
+extern pstring global_myname;
+extern fstring global_myworkgroup;
 
 /****************************************************************************
 Process a domain logon packet
@@ -41,25 +41,19 @@ void process_logon_packet(struct packet_struct *p,char *buf,int len,
   struct dgram_packet *dgram = &p->packet.dgram;
   pstring my_name;
   fstring reply_name;
-  BOOL add_slashes = False;
   pstring outbuf;
-  int code,reply_code;
-  char   unknown_byte = 0;
-  uint16 request_count = 0;
+  int code;
   uint16 token = 0;
-
   uint32 ntversion;
   uint16 lmnttoken;
   uint16 lm20token;
-  uint32 allowableaccount; /* Control bits, i.e. 0x80 == workstation trust a/c. */
   uint32 domainsidsize;
-  uint16 requestcount;
-  char *domainsid;
   char *getdc;
   char *uniuser; /* Unicode user name. */
   pstring ascuser;
   char *unicomp; /* Unicode computer name. */
-  struct smb_passwd *smb_pass; /* To check if machine account exists */
+
+  memset(outbuf, 0, sizeof(outbuf));
 
   if (!lp_domain_logons())
   {
@@ -68,7 +62,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
     return;
   }
 
-  strcpy(my_name, myname);
+  pstrcpy(my_name, global_myname);
   strupper(my_name);
 
   code = SVAL(buf,0);
@@ -84,25 +78,23 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       getdc = skip_string(user,1);
       q = skip_string(getdc,1);
-      unknown_byte = CVAL(q,0);
-      request_count = SVAL(q,1);
       token = SVAL(q,3);
 
-      reply_code = 0x6;
-      strcpy(reply_name,my_name); 
-      add_slashes = True;
+      fstrcpy(reply_name,my_name); 
 
       DEBUG(3,("process_logon_packet: Domain login request from %s at IP %s user=%s token=%x\n",
              machine,inet_ntoa(p->ip),user,token));
 
       q = outbuf;
-      SSVAL(q, 0, 6); q += 2;
+      SSVAL(q, 0, 6);
+      q += 2;
 
-      strcpy(reply_name, "\\\\");
-      strcat(reply_name, my_name);
-      strcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
+      fstrcpy(reply_name, "\\\\");
+      fstrcat(reply_name, my_name);
+      fstrcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
 
-      SSVAL(q, 0, token); q += 2;
+      SSVAL(q, 0, token);
+      q += 2;
 
       dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
@@ -112,7 +104,7 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
                     dgram->dest_name.name_type,
                     dgram->source_name.name,
                     dgram->source_name.name_type,
-                    p->ip, *iface_ip(p->ip));  
+                    p->ip, *iface_ip(p->ip), p->port);  
       break;
     }
 
@@ -128,29 +120,39 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
 
       q = skip_unicode_string(q, 1);
 
-      ntversion = IVAL(q, 0); q += 4;
-      lmnttoken = SVAL(q, 0); q += 2;
-      lm20token = SVAL(q, 0); q += 2;
+      ntversion = IVAL(q, 0);
+      q += 4;
+      lmnttoken = SVAL(q, 0);
+      q += 2;
+      lm20token = SVAL(q, 0);
+      q += 2;
 
       /* Construct reply. */
 
       q = outbuf;
-      SSVAL(q, 0, QUERYFORPDC_R); q += 2;
+      SSVAL(q, 0, QUERYFORPDC_R);
+      q += 2;
+
+      fstrcpy(reply_name,my_name);
+      fstrcpy(q, reply_name);
 
-      strcpy(reply_name,my_name);
-      strcpy(q, reply_name); q = skip_string(q, 1); /* PDC name */
+      q = skip_string(q, 1); /* PDC name */
 
       if (strcmp(mailslot, NT_LOGON_MAILSLOT)==0) {
         q = align2(q, buf);
 
-        PutUniCode(q, my_name); /* PDC name */
+        dos_PutUniCode(q, my_name, sizeof(pstring)); /* PDC name */
         q = skip_unicode_string(q, 1); 
-        PutUniCode(q, myworkgroup); /* Domain name*/
+
+        dos_PutUniCode(q, global_myworkgroup,sizeof(pstring)); /* Domain name*/
         q = skip_unicode_string(q, 1); 
 
-        SIVAL(q, 0, ntversion); q += 4;
-        SSVAL(q, 0, lmnttoken); q += 2;
-        SSVAL(q, 0, lm20token); q += 2;
+        SIVAL(q, 0, ntversion);
+        q += 4;
+        SSVAL(q, 0, lmnttoken);
+        q += 2;
+        SSVAL(q, 0, lm20token);
+        q += 2;
       }
 
       DEBUG(3,("process_logon_packet: GETDC request from %s at IP %s, \
@@ -167,7 +169,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                   dgram->dest_name.name_type,
                   dgram->source_name.name,
                   dgram->source_name.name_type,
-                  p->ip, *iface_ip(p->ip));  
+                  p->ip, *iface_ip(p->ip), p->port);  
       return;
     }
 
@@ -175,65 +177,59 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
     {
       char *q = buf + 2;
 
-      requestcount = SVAL(q, 0); q += 2;
+      q += 2;
       unicomp = q;
       uniuser = skip_unicode_string(unicomp,1);
       getdc = skip_unicode_string(uniuser,1);
       q = skip_string(getdc,1);
-      allowableaccount = IVAL(q, 0); q += 4;
-      domainsidsize = IVAL(q, 0); q += 4;
-      domainsid = q;
+      q += 4;
+      domainsidsize = IVAL(q, 0);
+      q += 4;
       q += domainsidsize + 3;
-      ntversion = IVAL(q, 0); q += 4;
-      lmnttoken = SVAL(q, 0); q += 2;
-      lm20token = SVAL(q, 0); q += 2;
+      ntversion = IVAL(q, 0);
+      q += 4;
+      lmnttoken = SVAL(q, 0);
+      q += 2;
+      lm20token = SVAL(q, 0);
+      q += 2;
 
       DEBUG(3,("process_logon_packet: SAMLOGON sidsize %d ntv %d\n", domainsidsize, ntversion));
 
       /*
-       * If MACHINE$ is in our password database then respond, else ignore.
+       * we respond regadless of whether the machine is in our password 
+       * database. If it isn't then we let smbd send an appropriate error.
        * Let's ignore the SID.
        */
 
-      pstrcpy(ascuser, unistr(uniuser));
+      pstrcpy(ascuser, dos_unistr(uniuser));
       DEBUG(3,("process_logon_packet: SAMLOGON user %s\n", ascuser));
 
-      strcpy(reply_name,"\\\\"); /* Here it wants \\LOGONSERVER. */
-      strcpy(reply_name+2,my_name); 
-
-      smb_pass = getsmbpwnam(ascuser);
+      fstrcpy(reply_name,"\\\\"); /* Here it wants \\LOGONSERVER. */
+      fstrcpy(reply_name+2,my_name); 
 
-      if(!smb_pass )
-      {
-        DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, not in password file\n",
-           unistr(unicomp),inet_ntoa(p->ip), ascuser));
-        return;
-      }
-      else if(smb_pass->acct_ctrl & ACB_DISABLED)
-      {
-        DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, accound disabled.\n",
-           unistr(unicomp),inet_ntoa(p->ip), ascuser));
-        return;
-      }
-      else
-      {
-        DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
-           unistr(unicomp),inet_ntoa(p->ip), ascuser, reply_name, myworkgroup,
-           SAMLOGON_R ,lmnttoken));
-      }
+      DEBUG(3,("process_logon_packet: SAMLOGON request from %s(%s) for %s, returning logon svr %s domain %s code %x token=%x\n",
+              dos_unistr(unicomp),inet_ntoa(p->ip), ascuser, reply_name, global_myworkgroup,
+              SAMLOGON_R ,lmnttoken));
 
       /* Construct reply. */
 
       q = outbuf;
-      SSVAL(q, 0, SAMLOGON_R); q += 2;
+      SSVAL(q, 0, SAMLOGON_R);
+      q += 2;
 
-      PutUniCode(q, reply_name); q = skip_unicode_string(q, 1);
-      unistrcpy(q, uniuser); q = skip_unicode_string(q, 1); /* User name (workstation trust account) */
-      PutUniCode(q, lp_workgroup()); q = skip_unicode_string(q, 1); /* Domain name. */
-
-      SIVAL(q, 0, ntversion); q += 4;
-      SSVAL(q, 0, lmnttoken); q += 2;
-      SSVAL(q, 0, lm20token); q += 2;
+      dos_PutUniCode(q, reply_name,sizeof(pstring));
+      q = skip_unicode_string(q, 1);
+      unistrcpy(q, uniuser);
+      q = skip_unicode_string(q, 1); /* User name (workstation trust account) */
+      dos_PutUniCode(q, lp_workgroup(),sizeof(pstring));
+      q = skip_unicode_string(q, 1); /* Domain name. */
+
+      SIVAL(q, 0, ntversion);
+      q += 4;
+      SSVAL(q, 0, lmnttoken);
+      q += 2;
+      SSVAL(q, 0, lm20token);
+      q += 2;
 
       dump_data(4, outbuf, PTR_DIFF(q, outbuf));
 
@@ -243,7 +239,7 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
                    dgram->dest_name.name_type,
                    dgram->source_name.name,
                    dgram->source_name.name_type,
-                   p->ip, *iface_ip(p->ip));  
+                   p->ip, *iface_ip(p->ip), p->port);  
       break;
     }