Apache2-AuthenNTLM

 view release on metacpan or  search on metacpan

smb/smbval/smblib-util.c  view on Meta::CPAN

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to negotiate\n");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed; /* Failed, check lower layer errno */
    return(SMBlibE_BAD);

  }

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_Negotiate failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(SMBlibE_BAD);

  }
  
  if (SVAL(SMB_Hdr(pkt), SMB_negrCP_idx_offset) == 0xFFFF) {

#ifdef DEBUG
    fprintf(stderr, "None of our protocols was accepted ... ");
#endif

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_NegNoProt;
    return(SMBlibE_BAD);

  }

  /* Now, unpack the info from the response, if any and evaluate the proto */
  /* selected. We must make sure it is one we like ...                     */

  Con_Handle -> prot_IDX = prot = SVAL(SMB_Hdr(pkt), SMB_negrCP_idx_offset);
  Con_Handle -> protocol = SMB_Figure_Protocol(Prots, prot);

  if (Con_Handle -> protocol == SMB_P_Unknown) { /* No good ... */

    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_ProtUnknown;
    return(SMBlibE_BAD);

  }
  
  switch (CVAL(SMB_Hdr(pkt), SMB_hdr_wct_offset)) {

  case 0x01:      /* No more info ... */

    break;

  case 13:        /* Up to and including LanMan 2.1 */

    Con_Handle -> Security = SVAL(SMB_Hdr(pkt), SMB_negrLM_sec_offset);
    Con_Handle -> encrypt_passwords = ((Con_Handle -> Security & SMB_sec_encrypt_mask) != 0x00);
    Con_Handle -> Security = Con_Handle -> Security & SMB_sec_user_mask;

    Con_Handle -> max_xmit = SVAL(SMB_Hdr(pkt), SMB_negrLM_mbs_offset);
    Con_Handle -> MaxMPX = SVAL(SMB_Hdr(pkt), SMB_negrLM_mmc_offset);
    Con_Handle -> MaxVC = SVAL(SMB_Hdr(pkt), SMB_negrLM_mnv_offset);
    Con_Handle -> Raw_Support = SVAL(SMB_Hdr(pkt), SMB_negrLM_rm_offset);
    Con_Handle -> SessionKey = IVAL(SMB_Hdr(pkt), SMB_negrLM_sk_offset);
    Con_Handle -> SvrTZ = SVAL(SMB_Hdr(pkt), SMB_negrLM_stz_offset);
    Con_Handle -> Encrypt_Key_Len = SVAL(SMB_Hdr(pkt), SMB_negrLM_ekl_offset);
    
    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset);
    fprintf(stderr, "%d", (char *)(SMB_Hdr(pkt) + SMB_negrLM_buf_offset));
    memcpy(Con_Handle->Encrypt_Key, p, 8);

    p = (SMB_Hdr(pkt) + SMB_negrLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  case 17:        /* NT LM 0.12 and LN LM 1.0 */

    Con_Handle -> Security = SVAL(SMB_Hdr(pkt), SMB_negrNTLM_sec_offset);
    Con_Handle -> encrypt_passwords = ((Con_Handle -> Security & SMB_sec_encrypt_mask) != 0x00);
    Con_Handle -> Security = Con_Handle -> Security & SMB_sec_user_mask;

    Con_Handle -> max_xmit = IVAL(SMB_Hdr(pkt), SMB_negrNTLM_mbs_offset);
    Con_Handle -> MaxMPX = SVAL(SMB_Hdr(pkt), SMB_negrNTLM_mmc_offset);
    Con_Handle -> MaxVC = SVAL(SMB_Hdr(pkt), SMB_negrNTLM_mnv_offset);
    Con_Handle -> MaxRaw = IVAL(SMB_Hdr(pkt), SMB_negrNTLM_mrs_offset);
    Con_Handle -> SessionKey = IVAL(SMB_Hdr(pkt), SMB_negrNTLM_sk_offset);
    Con_Handle -> SvrTZ = SVAL(SMB_Hdr(pkt), SMB_negrNTLM_stz_offset);
    Con_Handle -> Encrypt_Key_Len = CVAL(SMB_Hdr(pkt), SMB_negrNTLM_ekl_offset);

    p = (SMB_Hdr(pkt) + SMB_negrNTLM_buf_offset );
    memcpy(Con_Handle -> Encrypt_Key, p, 8);
    p = (SMB_Hdr(pkt) + SMB_negrNTLM_buf_offset + Con_Handle -> Encrypt_Key_Len);

    strncpy(p, Con_Handle -> Svr_PDom, sizeof(Con_Handle -> Svr_PDom) - 1);

    break;

  default:

#ifdef DEBUG
    fprintf(stderr, "Unknown NegProt response format ... Ignored\n");
    fprintf(stderr, "  wct = %i\n", CVAL(SMB_Hdr(pkt), SMB_hdr_wct_offset));
#endif

    break;
  }

#ifdef DEBUG
  fprintf(stderr, "Protocol selected is: %i:%s\n", prot, Prots[prot]);
#endif

  RFCNB_Free_Pkt(pkt);
  return(0);

}

/* Get our hostname */

void SMB_Get_My_Name(char *name, int len)

{ 
  /* int loc; */

  if (gethostname(name, len) < 0) { /* Error getting name */

    strncpy(name, "unknown", len);

    /* Should check the error */

#ifdef DEBUG
    fprintf(stderr, "gethostname in SMB_Get_My_Name returned error:");
    perror("");
#endif

  }

  /* only keep the portion up to the first "." */


}

/* Send a TCON to the remote server ...               */

SMB_Tree_Handle SMB_TreeConnect(SMB_Handle_Type Con_Handle, 
				SMB_Tree_Handle Tree_Handle,
				char *path, 
				char *password,
				char *device)

{ struct RFCNB_Pkt *pkt;
  int param_len, i, pkt_len;
  char *p;
  SMB_Tree_Handle tree;

  /* Figure out how much space is needed for path, password, dev ... */

  if (path == NULL || password == NULL || device == NULL) {

#ifdef DEBUG
    fprintf(stderr, "Bad parameter passed to SMB_TreeConnect\n");
#endif

    SMBlib_errno = SMBlibE_BadParam;
    return(NULL);

  }

  /* The + 2 is because of the \0 and the marker ...                    */

  param_len = strlen(path) + 2 + strlen(password) + 2 + strlen(device) + 2;

  /* The -1 accounts for the one byte smb_buf we have because some systems */
  /* don't like char msg_buf[]                                             */

  pkt_len = SMB_tcon_len + param_len;

  pkt = (struct RFCNB_Pkt *)RFCNB_Alloc_Pkt(pkt_len);

  if (pkt == NULL) {

    SMBlib_errno = SMBlibE_NoSpace;
    return(NULL); /* Should handle the error */

  }

  /* Now allocate a tree for this to go into ... */

  if (Tree_Handle == NULL) {

    tree = (SMB_Tree_Handle)malloc(sizeof(struct SMB_Tree_Structure));

    if (tree == NULL) {
    
      RFCNB_Free_Pkt(pkt);
      SMBlib_errno = SMBlibE_NoSpace;
      return(NULL);
      
    }
  }
  else {

    tree = Tree_Handle;

  }

  tree -> next = tree -> prev = NULL;
  tree -> con = Con_Handle;
  strncpy(tree -> path, path, sizeof(tree -> path));
  strncpy(tree -> device_type, device, sizeof(tree -> device_type));

  /* Now plug in the values ... */

  bzero(SMB_Hdr(pkt), SMB_tcon_len);
  SIVAL(SMB_Hdr(pkt), SMB_hdr_idf_offset, SMB_DEF_IDF);  /* Plunk in IDF */
  *(SMB_Hdr(pkt) + SMB_hdr_com_offset) = SMBtcon;
  SSVAL(SMB_Hdr(pkt), SMB_hdr_pid_offset, Con_Handle -> pid);
  SSVAL(SMB_Hdr(pkt), SMB_hdr_tid_offset, 0);
  SSVAL(SMB_Hdr(pkt), SMB_hdr_mid_offset, Con_Handle -> mid);
  SSVAL(SMB_Hdr(pkt), SMB_hdr_uid_offset, Con_Handle -> uid);
  *(SMB_Hdr(pkt) + SMB_hdr_wct_offset) = 0;

  SSVAL(SMB_Hdr(pkt), SMB_tcon_bcc_offset, param_len);

  /* Now copy the param strings in with the right stuff */

  p = (char *)(SMB_Hdr(pkt) + SMB_tcon_buf_offset);
  *p = SMBasciiID;
  strcpy(p + 1, path);
  p = p + strlen(path) + 2;
  *p = SMBasciiID;
  strcpy(p + 1, password);
  p = p + strlen(password) + 2;
  *p = SMBasciiID;
  strcpy(p + 1, device);

  /* Now send the packet and sit back ... */

  if (RFCNB_Send(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0){

#ifdef DEBUG
    fprintf(stderr, "Error sending TCon request\n");
#endif

    if (Tree_Handle == NULL)
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_SendFailed;
    return(NULL);

  }

  /* Now get the response ... */

  if (RFCNB_Recv(Con_Handle -> Trans_Connect, pkt, pkt_len) < 0) {

#ifdef DEBUG
    fprintf(stderr, "Error receiving response to TCon\n");
#endif

    if (Tree_Handle == NULL) 
      free(tree);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = -SMBlibE_RecvFailed;
    return(NULL);

  }

  /* Check out the response type ... */

  if (CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset) != SMBC_SUCCESS) {  /* Process error */

#ifdef DEBUG
    fprintf(stderr, "SMB_TCon failed with errorclass = %i, Error Code = %i\n",
	    CVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset),
	    SVAL(SMB_Hdr(pkt), SMB_hdr_err_offset));
#endif

    if (Tree_Handle == NULL)
      free(tree);
    SMBlib_SMB_Error = IVAL(SMB_Hdr(pkt), SMB_hdr_rcls_offset);
    RFCNB_Free_Pkt(pkt);
    SMBlib_errno = SMBlibE_Remote;
    return(NULL);

  }

  tree -> tid = SVAL(SMB_Hdr(pkt), SMB_tconr_tid_offset);
  tree -> mbs = SVAL(SMB_Hdr(pkt), SMB_tconr_mbs_offset);

#ifdef DEBUG
  fprintf(stderr, "TConn succeeded, with TID=%i, Max Xmit=%i\n",
                 tree -> tid, tree -> mbs);



( run in 1.362 second using v1.01-cache-2.11-cpan-d8267643d1d )