summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/rpc_client/cli_pipe.c156
1 files changed, 17 insertions, 139 deletions
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index adfdfe986e..f685f38754 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -300,7 +300,7 @@ static BOOL rpc_auth_pipe(struct cli_state *cli, prs_struct *rdata, int len, int
/****************************************************************************
- Send data on an rpc pipe, which *must* be in one fragment.
+ Send data on an rpc pipe via trans, which *must* be the last fragment.
receive response data from an rpc pipe, which may be large...
Read the first fragment: unfortunately have to use SMBtrans for the first
@@ -341,7 +341,7 @@ static BOOL rpc_api_pipe(struct cli_state *cli, prs_struct *data, prs_struct *rd
/* Create setup parameters - must be in native byte order. */
- setup[0] = 0x26;
+ setup[0] = TRANSACT_DCERPCCMD;
setup[1] = cli->nt_pipe_fnum; /* Pipe file handle. */
DEBUG(5,("rpc_api_pipe: fnum:%x\n", (int)cli->nt_pipe_fnum));
@@ -772,6 +772,10 @@ static uint32 create_rpc_request(prs_struct *rpc_out, uint8 op_num, int data_len
return callid;
}
+/*******************************************************************
+ Puts an auth header into an rpc request.
+ ********************************************************************/
+
static BOOL create_auth_hdr(prs_struct *outgoing_packet, BOOL auth_verify)
{
RPC_HDR_AUTH hdr_auth;
@@ -787,6 +791,10 @@ static BOOL create_auth_hdr(prs_struct *outgoing_packet, BOOL auth_verify)
return True;
}
+/*******************************************************************
+ Puts auth data into an rpc request.
+ ********************************************************************/
+
static BOOL create_auth_data(struct cli_state *cli, uint32 crc32,
prs_struct *outgoing_packet)
{
@@ -807,6 +815,13 @@ static BOOL create_auth_data(struct cli_state *cli, uint32 crc32,
return True;
}
+/**
+ * Send a request on an RPC pipe and get a response.
+ *
+ * @param data NDR contents of the request to be sent.
+ * @param rdata Unparsed NDR response data.
+**/
+
BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
prs_struct *data, prs_struct *rdata)
{
@@ -928,143 +943,6 @@ BOOL rpc_api_pipe_req(struct cli_state *cli, uint8 op_num,
return ret;
}
-/**
- * Send a request on an RPC pipe and get a response.
- *
- * @param data NDR contents of the request to be sent.
- * @param rdata Unparsed NDR response data.
-**/
-
-BOOL rpc_api_pipe_req2(struct cli_state *cli, uint8 op_num,
- prs_struct *data, prs_struct *rdata)
-{
- prs_struct outgoing_packet;
- uint32 data_len;
- uint32 auth_len;
- BOOL ret;
- BOOL auth_verify;
- BOOL auth_seal;
- uint32 crc32 = 0;
- char *pdata_out = NULL;
- fstring dump_name;
-
- auth_verify = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SIGN) != 0);
- auth_seal = ((cli->ntlmssp_srv_flgs & NTLMSSP_NEGOTIATE_SEAL) != 0);
-
- /* Optionally capture for use in debugging */
- slprintf(dump_name, sizeof(dump_name) - 1, "call_%s",
- cli_pipe_get_name(cli));
- prs_dump_before(dump_name, op_num, data);
-
- /*
- * The auth_len doesn't include the RPC_HDR_AUTH_LEN.
- */
-
- auth_len = (auth_verify ? RPC_AUTH_NTLMSSP_CHK_LEN : 0);
-
- /*
- * PDU len is header, plus request header, plus data, plus
- * auth_header_len (if present), plus auth_len (if present).
- * NB. The auth stuff should be aligned on an 8 byte boundary
- * to be totally DCE/RPC spec complient. For now we cheat and
- * hope that the data structs defined are a multiple of 8 bytes.
- */
-
- if((prs_offset(data) % 8) != 0) {
- DEBUG(5,("rpc_api_pipe_req: Outgoing data not a multiple of 8 bytes....\n"));
- }
-
- data_len = RPC_HEADER_LEN + RPC_HDR_REQ_LEN + prs_offset(data) +
- (auth_verify ? RPC_HDR_AUTH_LEN : 0) + auth_len;
-
- /*
- * Malloc a parse struct to hold it (and enough for alignments).
- */
-
- if(!prs_init(&outgoing_packet, data_len + 8, cli->mem_ctx, MARSHALL)) {
- DEBUG(0,("rpc_api_pipe_req: Failed to malloc %u bytes.\n", (unsigned int)data_len ));
- return False;
- }
-
- pdata_out = prs_data_p(&outgoing_packet);
-
- /*
- * Write out the RPC header and the request header.
- */
-
- if(!create_rpc_request(&outgoing_packet, op_num, data_len, auth_len,
- (uint8) RPC_FLG_FIRST | RPC_FLG_LAST, 0, data_len)) {
- DEBUG(0,("rpc_api_pipe_req: Failed to create RPC request.\n"));
- prs_mem_free(&outgoing_packet);
- return False;
- }
-
- /*
- * Seal the outgoing data if requested.
- */
-
- if (auth_seal) {
- crc32 = crc32_calc_buffer(prs_data_p(data), prs_offset(data));
- NTLMSSPcalc_ap(cli, (unsigned char*)prs_data_p(data), prs_offset(data));
- }
-
- /*
- * Now copy the data into the outgoing packet.
- */
-
- if(!prs_append_prs_data( &outgoing_packet, data)) {
- DEBUG(0,("rpc_api_pipe_req: Failed to append data to outgoing packet.\n"));
- prs_mem_free(&outgoing_packet);
- return False;
- }
-
- /*
- * Add a trailing auth_verifier if needed.
- */
-
- if (auth_seal || auth_verify) {
- RPC_HDR_AUTH hdr_auth;
-
- init_rpc_hdr_auth(&hdr_auth, NTLMSSP_AUTH_TYPE,
- NTLMSSP_AUTH_LEVEL, 0x08, (auth_verify ? 1 : 0));
- if(!smb_io_rpc_hdr_auth("hdr_auth", &hdr_auth, &outgoing_packet, 0)) {
- DEBUG(0,("rpc_api_pipe_req: Failed to marshal RPC_HDR_AUTH.\n"));
- prs_mem_free(&outgoing_packet);
- return False;
- }
- }
-
- /*
- * Finally the auth data itself.
- */
-
- if (auth_verify) {
- RPC_AUTH_NTLMSSP_CHK chk;
- uint32 current_offset = prs_offset(&outgoing_packet);
-
- init_rpc_auth_ntlmssp_chk(&chk, NTLMSSP_SIGN_VERSION, crc32, cli->ntlmssp_seq_num++);
- if(!smb_io_rpc_auth_ntlmssp_chk("auth_sign", &chk, &outgoing_packet, 0)) {
- DEBUG(0,("rpc_api_pipe_req: Failed to marshal RPC_AUTH_NTLMSSP_CHK.\n"));
- prs_mem_free(&outgoing_packet);
- return False;
- }
- NTLMSSPcalc_ap(cli, (unsigned char*)&pdata_out[current_offset+4], RPC_AUTH_NTLMSSP_CHK_LEN - 4);
- }
-
- DEBUG(100,("data_len: %x data_calc_len: %x\n", data_len, prs_offset(&outgoing_packet)));
-
- ret = rpc_api_pipe(cli, &outgoing_packet, rdata);
-
- /* Also capture received data */
- slprintf(dump_name, sizeof(dump_name) - 1, "reply_%s",
- cli_pipe_get_name(cli));
- prs_dump(dump_name, op_num, rdata);
-
- prs_mem_free(&outgoing_packet);
-
- return ret;
-}
-
/****************************************************************************
Set the handle state.
****************************************************************************/