diff options
Diffstat (limited to 'source3/lib/msrpc-client.c')
-rw-r--r-- | source3/lib/msrpc-client.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/source3/lib/msrpc-client.c b/source3/lib/msrpc-client.c index 696413b4f9..9b9350cb7e 100644 --- a/source3/lib/msrpc-client.c +++ b/source3/lib/msrpc-client.c @@ -27,6 +27,29 @@ extern int DEBUGLEVEL; /**************************************************************************** +open the msrpcent sockets +****************************************************************************/ +static BOOL ncalrpc_l_connect(struct msrpc_local *msrpc, const char *pipe_name) +{ + fstring path; + fstring pname; + fstrcpy(pname, pipe_name); + strlower(pname); + slprintf(path, sizeof(path) - 1, "%s/.msrpc/%s", LOCKDIR, pname); + + fstrcpy(msrpc->pipe_name, pipe_name); + + msrpc->fd = open_pipe_sock(path); + + if (msrpc->fd == -1) + { + return False; + } + + return True; +} + +/**************************************************************************** read an msrpc pdu from a fd. The timeout is in milliseconds. ****************************************************************************/ @@ -141,6 +164,46 @@ static void ncalrpc_l_close_socket(struct msrpc_local *msrpc) msrpc->fd = -1; } +static BOOL ncalrpc_l_authenticate(struct msrpc_local *msrpc) +{ + int sock = msrpc->fd; + uint32 len; + char *data; + prs_struct ps; + uint32 status; + + uint16 command; + + command = AGENT_CMD_CON; + + if (!create_user_creds(&ps, msrpc->pipe_name, 0x0, command, + msrpc->nt.key.pid, NULL)) + { + DEBUG(0, ("could not parse credentials\n")); + close(sock); + return False; + } + + len = ps.data_offset; + data = prs_data(&ps, 0); + + SIVAL(data, 0, len); + +#ifdef DEBUG_PASSWORD + DEBUG(100, ("data len: %d\n", len)); + dump_data(100, data, len); +#endif + + if (write_socket(sock, data, len) <= 0) + { + DEBUG(0, ("write failed\n")); + return False; + } + len = read_data(sock, (char*)&status, sizeof(status)); + + return len == sizeof(status) && status == 0x0; +} + /**************************************************************************** shutdown a msrpcent structure @@ -160,6 +223,62 @@ void ncalrpc_l_shutdown(struct msrpc_local *msrpc) memset(msrpc, 0, sizeof(*msrpc)); } +/**************************************************************************** +initialise a msrpcent structure +****************************************************************************/ +struct msrpc_local *ncalrpc_l_initialise(struct msrpc_local *msrpc, + const vuser_key * key) +{ + if (!msrpc) + { + msrpc = (struct msrpc_local *)malloc(sizeof(*msrpc)); + if (!msrpc) + return NULL; + ZERO_STRUCTP(msrpc); + } + + if (msrpc->initialised) + { + ncalrpc_l_shutdown(msrpc); + } + + ZERO_STRUCTP(msrpc); + + msrpc->fd = -1; + msrpc->outbuf = (char *)malloc(CLI_BUFFER_SIZE + 4); + msrpc->inbuf = (char *)malloc(CLI_BUFFER_SIZE + 4); + if (!msrpc->outbuf || !msrpc->inbuf) + { + return False; + } + + msrpc->initialised = 1; + + if (key != NULL) + { + msrpc->nt.key = *key; + } + else + { + NET_USER_INFO_3 usr; + uid_t uid = getuid(); + gid_t gid = getgid(); + char *name = uidtoname(uid); + + ZERO_STRUCT(usr); + + msrpc->nt.key.pid = sys_getpid(); + +#if 0 /* comment ou by JERRY */ + msrpc->nt.key.vuid = register_vuid(msrpc->nt.key.pid, + uid, gid, + name, name, False, &usr); +#endif /* comment ou by JERRY */ + } + + return msrpc; +} + /**************************************************************************** open the msrpcent sockets @@ -433,3 +552,48 @@ BOOL msrpc_establish_connection(struct msrpc_state *msrpc, return True; } +/**************************************************************************** +establishes a connection right up to doing tconX, reading in a password. +****************************************************************************/ +BOOL ncalrpc_l_establish_connection(struct msrpc_local *msrpc, + const char *pipe_name) +{ + if (strnequal("\\PIPE\\", pipe_name, 6)) + { + pipe_name = &pipe_name[6]; + } + + DEBUG(5, ("ncalrpc_l_establish_connection: connecting to %s\n", + pipe_name)); + + /* establish connection */ + + if (!msrpc->initialised) + { + return False; + } + + if (msrpc->fd == -1) + { + if (!ncalrpc_l_connect(msrpc, pipe_name)) + { + DEBUG(1, + ("ncalrpc_l_establish_connection: failed %s)\n", + pipe_name)); + + return False; + } + } + + if (!ncalrpc_l_authenticate(msrpc)) + { + DEBUG(0, ("authenticate failed\n")); + close(msrpc->fd); + msrpc->fd = -1; + return False; + } + + return True; +} + + |