summaryrefslogtreecommitdiff
path: root/source3/lib/msrpc-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/msrpc-client.c')
-rw-r--r--source3/lib/msrpc-client.c164
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;
+}
+
+