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 68a0ff40007e54015c0a78ff7590beec3ed2977b..279ab1c764fb05a6eb11581f30346b7948bbbe2d 100644 (file)
@@ -44,7 +44,6 @@ void process_logon_packet(struct packet_struct *p,char *buf,int len,
   pstring outbuf;
   int code;
   uint16 token = 0;
-
   uint32 ntversion;
   uint16 lmnttoken;
   uint16 lm20token;
@@ -53,7 +52,8 @@ void process_logon_packet(struct packet_struct *p,char *buf,int len,
   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())
   {
@@ -86,13 +86,15 @@ logons are not enabled.\n", inet_ntoa(p->ip) ));
              machine,inet_ntoa(p->ip),user,token));
 
       q = outbuf;
-      SSVAL(q, 0, 6); q += 2;
+      SSVAL(q, 0, 6);
+      q += 2;
 
       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));
 
@@ -118,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); q = skip_string(q, 1); /* PDC name */
+      fstrcpy(q, reply_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, global_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, \
@@ -165,62 +177,59 @@ reporting %s domain %s 0x%x ntversion=%x lm_nt token=%x lm_20 token=%x\n",
     {
       char *q = buf + 2;
 
+      q += 2;
       unicomp = q;
       uniuser = skip_unicode_string(unicomp,1);
       getdc = skip_unicode_string(uniuser,1);
       q = skip_string(getdc,1);
-      domainsidsize = IVAL(q, 0); q += 4;
+      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));
 
       fstrcpy(reply_name,"\\\\"); /* Here it wants \\LOGONSERVER. */
       fstrcpy(reply_name+2,my_name); 
 
-      smb_pass = getsmbpwnam(ascuser);
-
-      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, global_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));