Fixed two debug prints.
[kai/samba.git] / source / smbd / ipc.c
index db6ee62f9180b8cfcc1dfb566f7906f2374b2ba8..eed5a71401750d638129fe10b9f865807956617a 100644 (file)
@@ -1653,7 +1653,7 @@ static BOOL api_SetUserPassword(connection_struct *conn,uint16 vuid, char *param
    * Older versions of Windows seem to do this.
    */
 
-  if (password_ok(user,pass1,strlen(pass1),NULL) &&
+  if (password_ok(user, pass1,strlen(pass1),NULL) &&
       chgpasswd(user,pass1,pass2,False))
   {
     SSVAL(*rparam,0,NERR_Success);
@@ -1692,11 +1692,7 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
                                int *rdata_len,int *rparam_len)
 {
   fstring user;
-  fstring new_passwd;
-  struct smb_passwd *sampw = NULL;
   char *p = param + 2;
-  int ret = True;
-
   *rparam_len = 2;
   *rparam = REALLOC(*rparam,*rparam_len);
 
@@ -1708,13 +1704,13 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
    * Check the parameter definition is correct.
    */
   if(!strequal(param + 2, "zsT")) {
-    DEBUG(0,("api_SamOEMChangePassword: Invalid parameter string %sn\n", param + 2));
+    DEBUG(0,("api_SamOEMChangePassword: Invalid parameter string %s\n", param + 2));
     return False;
   }
   p = skip_string(p, 1);
 
   if(!strequal(p, "B516B16")) {
-    DEBUG(0,("api_SamOEMChangePassword: Invalid data parameter string %sn\n", p));
+    DEBUG(0,("api_SamOEMChangePassword: Invalid data parameter string %s\n", p));
     return False;
   }
   p = skip_string(p,1);
@@ -1736,24 +1732,8 @@ static BOOL api_SamOEMChangePassword(connection_struct *conn,uint16 vuid, char *
    */
   (void)Get_Pwnam( user, True);
 
-  if(check_oem_password( user, (unsigned char *)data, &sampw, 
-                         new_passwd, (int)sizeof(new_passwd)) == False) {
-    return True;
-  }
-
-  /* 
-   * At this point we have the new case-sensitive plaintext
-   * password in the fstring new_passwd. If we wanted to synchronise
-   * with UNIX passwords we would call a UNIX password changing 
-   * function here. However it would have to be done as root
-   * as the plaintext of the old users password is not 
-   * available. JRA.
-   */
-
-  if(lp_unix_password_sync())
-    ret = chgpasswd(user,"", new_passwd, True);
-  if(ret && change_oem_password( sampw, new_passwd, False)) {
+  if (pass_oem_change(user, (uchar*) data, (uchar *)&data[516], NULL, NULL))
+  {
     SSVAL(*rparam,0,NERR_Success);
   }
 
@@ -3110,204 +3090,44 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
   return(True);
 }
 
-struct api_cmd
-{
-  char * pipe_clnt_name;
-  char * pipe_srv_name;
-  BOOL (*fn) (pipes_struct *, prs_struct *);
-};
-
-static struct api_cmd api_fd_commands[] =
-{
-    { "lsarpc",   "lsass",   api_ntlsa_rpc },
-    { "samr",     "lsass",   api_samr_rpc },
-    { "srvsvc",   "ntsvcs",  api_srvsvc_rpc },
-    { "wkssvc",   "ntsvcs",  api_wkssvc_rpc },
-    { "NETLOGON", "lsass",   api_netlog_rpc },
-    { "winreg",   "winreg",  api_reg_rpc },
-    { NULL,       NULL,      NULL }
-};
-
-static BOOL api_pipe_bind_req(pipes_struct *p, prs_struct *pd)
-{
-       BOOL ntlmssp_auth = False;
-       fstring ack_pipe_name;
-       int i = 0;
-
-       DEBUG(5,("api_pipe_bind_req: decode request. %d\n", __LINE__));
-
-       for (i = 0; api_fd_commands[i].pipe_clnt_name; i++)
-       {
-               if (strequal(api_fd_commands[i].pipe_clnt_name, p->name) &&
-                   api_fd_commands[i].fn != NULL)
-               {
-                       DEBUG(3,("api_pipe_bind_req: \\PIPE\\%s -> \\PIPE\\%s\n",
-                                  api_fd_commands[i].pipe_clnt_name,
-                                  api_fd_commands[i].pipe_srv_name));
-                       fstrcpy(p->pipe_srv_name, api_fd_commands[i].pipe_srv_name);
-                       break;
-               }
-       }
-
-       if (api_fd_commands[i].fn == NULL) return False;
-
-       /* decode the bind request */
-       smb_io_rpc_hdr_rb("", &p->hdr_rb, pd, 0);
-
-       if (pd->offset == 0) return False;
-
-       if (p->hdr.auth_len != 0)
-       {
-               /* decode the authentication verifier */
-               smb_io_rpc_auth_ntlmssp_req("", &p->ntlmssp_req, pd, 0);
-
-               if (pd->offset == 0) return False;
-
-               /* ignore the version number for now */
-               ntlmssp_auth = strequal(p->ntlmssp_req.ntlmssp_str, "NTLMSSP");
-       }
-
-       /* name has to be \PIPE\xxxxx */
-       fstrcpy(ack_pipe_name, "\\PIPE\\");
-       fstrcat(ack_pipe_name, p->pipe_srv_name);
-
-       DEBUG(5,("api_pipe_bind_req: make response. %d\n", __LINE__));
-
-       prs_init(&(p->rdata), 1024, 4, 0, False);
-       prs_init(&(p->rhdr ), 0x10, 4, 0, False);
-       prs_init(&(p->rauth), 1024, 4, 0, False);
-
-    /***/
-       /*** do the bind ack first ***/
-    /***/
-
-       make_rpc_hdr_ba(&p->hdr_ba,
-                                       p->hdr_rb.bba.max_tsize,
-                       p->hdr_rb.bba.max_rsize,
-                       p->hdr_rb.bba.assoc_gid,
-                                       ack_pipe_name,
-                                       0x1, 0x0, 0x0,
-                                       &(p->hdr_rb.transfer));
-
-       smb_io_rpc_hdr_ba("", &p->hdr_ba, &p->rdata, 0);
-       mem_realloc_data(p->rdata.data, p->rdata.offset);
-
-    /***/
-       /*** now the authentication ***/
-    /***/
-
-       if (ntlmssp_auth)
-       {
-               uint8 data[16];
-               bzero(data, sizeof(data)); /* first 8 bytes are non-zero */
-
-               make_rpc_auth_ntlmssp_resp(&p->ntlmssp_resp,
-                                          0x0a, 0x06, 0,
-                                          "NTLMSSP", 2,
-                                          0x00000000, 0x0000b2b3, 0x000082b1,
-                                          data);
-               smb_io_rpc_auth_ntlmssp_resp("", &p->ntlmssp_resp, &p->rauth, 0);
-               mem_realloc_data(p->rauth.data, p->rauth.offset);
-       }
-
-    /***/
-       /*** then do the header, now we know the length ***/
-    /***/
-
-       make_rpc_hdr(&p->hdr, RPC_BINDACK, RPC_FLG_FIRST | RPC_FLG_LAST,
-                                p->hdr.call_id,
-                    p->rdata.offset + p->rauth.offset + 0x10,
-                    p->rauth.offset);
-
-       smb_io_rpc_hdr("", &p->hdr, &p->rhdr, 0);
-       mem_realloc_data(p->rhdr.data, p->rdata.offset);
-
-    /***/
-       /*** link rpc header, bind acknowledgment and authentication responses ***/
-    /***/
-
-       p->rhdr.data->offset.start = 0;
-       p->rhdr.data->offset.end   = p->rhdr.offset;
-       p->rhdr.data->next         = p->rdata.data;
-
-       if (ntlmssp_auth)
-       {
-               p->rdata.data->offset.start = p->rhdr.offset;
-               p->rdata.data->offset.end   = p->rhdr.offset + p->rdata.offset;
-               p->rdata.data->next         = p->rauth.data;
-
-               p->rauth.data->offset.start = p->rhdr.offset + p->rdata.offset;
-               p->rauth.data->offset.end   = p->rhdr.offset + p->rauth.offset + p->rdata.offset;
-               p->rauth.data->next         = NULL;
-       }
-       else
-       {
-               p->rdata.data->offset.start = p->rhdr.offset;
-               p->rdata.data->offset.end   = p->rhdr.offset + p->rdata.offset;
-               p->rdata.data->next         = NULL;
-       }
-
-       return True;
-}
-
-static BOOL api_pipe_request(pipes_struct *p, prs_struct *pd)
+static void api_rpc_trans_reply(char *outbuf,
+                               pipes_struct *p,
+                               prs_struct *pd)
 {
-       int i = 0;
+       send_trans_reply(outbuf, p->rhdr.data, NULL, NULL, 0, p->file_offset);
 
-       for (i = 0; api_fd_commands[i].pipe_clnt_name; i++)
+       if (mem_buf_len(p->rhdr.data) <= p->file_offset)
        {
-               if (strequal(api_fd_commands[i].pipe_clnt_name, p->name) &&
-                   api_fd_commands[i].fn != NULL)
-               {
-                       DEBUG(3,("Doing \\PIPE\\%s\n", api_fd_commands[i].pipe_clnt_name));
-                       return api_fd_commands[i].fn(p, pd);
-               }
+               /* all of data was sent: no need to wait for SMBreadX calls */
+               mem_free_data(p->rhdr .data);
+               mem_free_data(p->rdata.data);
+               mem_free_data(p->rdata_i.data);
        }
-       return False;
 }
 
-static BOOL api_dce_rpc_command(char *outbuf,
-                               pipes_struct *p,
-                               prs_struct *pd)
+/****************************************************************************
+ WaitNamedPipeHandleState 
+****************************************************************************/
+static BOOL api_WNPHS(char *outbuf, pipes_struct *p, char *param)
 {
-       BOOL reply = False;
-       if (pd->data == NULL) return False;
-
-       /* process the rpc header */
-       smb_io_rpc_hdr("", &p->hdr, pd, 0);
+       uint16 priority;
 
-       if (pd->offset == 0) return False;
+       if (!param) return False;
 
-       switch (p->hdr.pkt_type)
-       {
-               case RPC_BIND   :
-               {
-                       reply = api_pipe_bind_req(p, pd);
-                       break;
-               }
-               case RPC_REQUEST:
-               {
-                       reply = api_pipe_request (p, pd);
-                       break;
-               }
-       }
+       priority = param[0] + (param[1] << 8);
+       DEBUG(4,("WaitNamedPipeHandleState priority %x\n", priority));
 
-       if (reply)
+       if (wait_rpc_pipe_hnd_state(p, priority))
        {
                /* now send the reply */
-               send_trans_reply(outbuf, p->rhdr.data, NULL, NULL, 0, p->file_offset);
+               send_trans_reply(outbuf, NULL, NULL, NULL, 0, p->file_offset);
 
-               if (mem_buf_len(p->rhdr.data) <= p->file_offset)
-               {
-                       /* all of data was sent: no need to wait for SMBreadX calls */
-                       mem_free_data(p->rhdr .data);
-                       mem_free_data(p->rdata.data);
-               }
+               return True;
        }
-
-       return reply;
+       return False;
 }
 
+
 /****************************************************************************
  SetNamedPipeHandleState 
 ****************************************************************************/
@@ -3318,7 +3138,7 @@ static BOOL api_SNPHS(char *outbuf, pipes_struct *p, char *param)
        if (!param) return False;
 
        id = param[0] + (param[1] << 8);
-       DEBUG(4,("lsarpc SetNamedPipeHandleState to code %x\n", id));
+       DEBUG(4,("SetNamedPipeHandleState to code %x\n", id));
 
        if (set_rpc_pipe_hnd_state(p, id))
        {
@@ -3371,20 +3191,12 @@ static int api_fd_reply(connection_struct *conn,uint16 vuid,char *outbuf,
        int subcommand;
        pipes_struct *p = NULL;
        prs_struct pd;
-       struct mem_buf data_buf;
 
        DEBUG(5,("api_fd_reply\n"));
 
-       /* fake up a data buffer from the api_fd_reply data parameters */
-       mem_create(&data_buf, data, tdscnt, 0, False);
-       data_buf.offset.start = 0;
-       data_buf.offset.end   = tdscnt;
-
-       /* fake up a parsing structure */
-       pd.data = &data_buf;
-       pd.align = 4;
-       pd.io = True;
-       pd.offset = 0;
+       /* make a static data parsing structure from the api_fd_reply data */
+       prs_init(&pd, 0, 4, 0, True);
+       mem_create(pd.data, data, 0, tdscnt, 0, False);
 
        /* First find out the name of this file. */
        if (suwcnt != 2)
@@ -3414,7 +3226,17 @@ static int api_fd_reply(connection_struct *conn,uint16 vuid,char *outbuf,
                        case 0x26:
                        {
                                /* dce/rpc command */
-                               reply = api_dce_rpc_command(outbuf, p, &pd);
+                               reply = rpc_command(p, &pd);
+                               if (reply)
+                               {
+                                       api_rpc_trans_reply(outbuf, p, &pd);
+                               }
+                               break;
+                       }
+                       case 0x53:
+                       {
+                               /* Wait Named Pipe Handle state */
+                               reply = api_WNPHS(outbuf, p, params);
                                break;
                        }
                        case 0x01:
@@ -3430,6 +3252,8 @@ static int api_fd_reply(connection_struct *conn,uint16 vuid,char *outbuf,
                DEBUG(1,("api_fd_reply: INVALID PIPE HANDLE: %x\n", pnum));
        }
 
+       mem_free_data(pd.data);
+
        if (!reply)
        {
                return api_no_reply(outbuf, mdrcnt);
@@ -3528,7 +3352,7 @@ struct
 static int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data,char *params,
                     int tdscnt,int tpscnt,int mdrcnt,int mprcnt)
 {
-  int api_command = SVAL(params,0);
+  int api_command;
   struct mem_buf rdata_buf;
   struct mem_buf rparam_buf;
   char *rdata = NULL;
@@ -3538,8 +3362,14 @@ static int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data
   BOOL reply=False;
   int i;
 
+  SMB_ASSERT(params != 0);
+
+  api_command = SVAL(params,0);
+
   DEBUG(3,("Got API command %d of form <%s> <%s> (tdscnt=%d,tpscnt=%d,mdrcnt=%d,mprcnt=%d)\n",
-          api_command,params+2,skip_string(params+2,1),
+          api_command,
+          params+2,
+          skip_string(params+2,1),
           tdscnt,tpscnt,mdrcnt,mprcnt));
 
   for (i=0;api_commands[i].name;i++)
@@ -3575,14 +3405,8 @@ static int api_reply(connection_struct *conn,uint16 vuid,char *outbuf,char *data
                    &rdata,&rparam,&rdata_len,&rparam_len);
 
       
-  mem_create(&rdata_buf , rdata , rdata_len , 0, False);
-  mem_create(&rparam_buf, rparam, rparam_len, 0, False);
-
-  rdata_buf.offset.start = 0;
-  rdata_buf.offset.end   = rdata_len;
-
-  rparam_buf.offset.start = 0;
-  rparam_buf.offset.end   = rparam_len;
+  mem_create(&rdata_buf , rdata , 0, rdata_len , 0, False);
+  mem_create(&rparam_buf, rparam, 0, rparam_len, 0, False);
 
   /* now send the reply */
   send_trans_reply(outbuf, &rdata_buf, &rparam_buf, NULL, 0, 0);
@@ -3608,6 +3432,16 @@ static int named_pipe(connection_struct *conn,uint16 vuid, char *outbuf,char *na
                return api_reply(conn,vuid,outbuf,data,params,tdscnt,tpscnt,mdrcnt,mprcnt);
        }
 
+       if (strequal(name,"WKSSVC") ||
+           strequal(name,"SRVSVC") ||
+           strequal(name,"WINREG") ||
+           strequal(name,"SAMR") ||
+           strequal(name,"LSARPC"))
+       {
+               DEBUG(4,("named pipe command from Win95 (wow!)\n"));
+               return api_fd_reply(conn,vuid,outbuf,setup,data,params,suwcnt,tdscnt,tpscnt,mdrcnt,mprcnt);
+       }
+
        if (strlen(name) < 1)
        {
                return api_fd_reply(conn,vuid,outbuf,setup,data,params,suwcnt,tdscnt,tpscnt,mdrcnt,mprcnt);
@@ -3628,7 +3462,7 @@ static int named_pipe(connection_struct *conn,uint16 vuid, char *outbuf,char *na
 int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int bufsize)
 {
        fstring name;
-
+        int name_offset = 0;
        char *data=NULL,*params=NULL;
        uint16 *setup=NULL;
        int outsize = 0;
@@ -3655,17 +3489,17 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int
   
        if (tdscnt)  {
                if((data = (char *)malloc(tdscnt)) == NULL) {
-          DEBUG(0,("reply_trans: data malloc fail for %d bytes !\n", tdscnt));
-                 return(ERROR(ERRDOS,ERRnomem));
-        } 
+                       DEBUG(0,("reply_trans: data malloc fail for %d bytes !\n", tdscnt));
+                       return(ERROR(ERRDOS,ERRnomem));
+               
                memcpy(data,smb_base(inbuf)+dsoff,dscnt);
        }
 
        if (tpscnt) {
                if((params = (char *)malloc(tpscnt)) == NULL) {
-          DEBUG(0,("reply_trans: param malloc fail for %d bytes !\n", tpscnt));
-                 return(ERROR(ERRDOS,ERRnomem));
-        } 
+                       DEBUG(0,("reply_trans: param malloc fail for %d bytes !\n", tpscnt));
+                       return(ERROR(ERRDOS,ERRnomem));
+               
                memcpy(params,smb_base(inbuf)+psoff,pscnt);
        }
 
@@ -3738,9 +3572,19 @@ int reply_trans(connection_struct *conn, char *inbuf,char *outbuf, int size, int
        DEBUG(3,("trans <%s> data=%d params=%d setup=%d\n",
                 name,tdscnt,tpscnt,suwcnt));
        
-       if (strncmp(name,"\\PIPE\\",strlen("\\PIPE\\")) == 0) {
+        /*
+         * WinCE wierdness....
+         */
+
+        if (name[0] == '\\' && (StrnCaseCmp(&name[1],local_machine,
+                                strlen(local_machine)) == 0)) {
+          name_offset = strlen(local_machine)+1;
+        }
+
+       if (strncmp(&name[name_offset],"\\PIPE\\",strlen("\\PIPE\\")) == 0) {
                DEBUG(5,("calling named_pipe\n"));
-               outsize = named_pipe(conn,vuid,outbuf,name+strlen("\\PIPE\\"),setup,data,params,
+               outsize = named_pipe(conn,vuid,outbuf,
+                                    name+name_offset+strlen("\\PIPE\\"),setup,data,params,
                                     suwcnt,tdscnt,tpscnt,msrcnt,mdrcnt,mprcnt);
        } else {
                DEBUG(3,("invalid pipe name\n"));