#include "rpc_dce.h"
#include "librpc/gen_ndr/netlogon.h"
#include "librpc/gen_ndr/auth.h"
-#include "registry/reg_parse_prs.h"
#include "lib/tsocket/tsocket.h"
#include "libcli/named_pipe_auth/npa_tstream.h"
#include "../auth/auth_sam_reply.h"
+#include "auth.h"
+#include "ntdomain.h"
#define SERVER_TCP_LOW_PORT 1024
#define SERVER_TCP_HIGH_PORT 1300
static NTSTATUS auth_anonymous_session_info(TALLOC_CTX *mem_ctx,
- struct auth_session_info_transport **session_info)
+ struct auth_session_info **session_info)
{
- struct auth_session_info_transport *i;
+ struct auth_session_info *i;
struct auth_serversupplied_info *s;
struct auth_user_info_dc *u;
union netr_Validation val;
NTSTATUS status;
- i = talloc_zero(mem_ctx, struct auth_session_info_transport);
+ i = talloc_zero(mem_ctx, struct auth_session_info);
if (i == NULL) {
return NT_STATUS_NO_MEMORY;
}
}
i->security_token = s->security_token;
- i->session_key = s->user_session_key;
+ i->session_key = s->session_key;
val.sam3 = s->info3;
const char *pipe_name,
const struct ndr_syntax_id id,
enum dcerpc_transport_t transport,
- bool system_user,
+ bool ncalrpc_as_system,
const char *client_address,
const char *server_address,
- struct auth_session_info_transport *session_info,
+ struct auth_session_info *session_info,
struct pipes_struct **_p,
int *perrno)
{
struct netr_SamInfo3 *info3;
struct auth_user_info_dc *auth_user_info_dc;
struct pipes_struct *p;
+ struct auth_serversupplied_info *server_info;
NTSTATUS status;
bool ok;
}
p->syntax = id;
p->transport = transport;
- p->system_user = system_user;
+ p->ncalrpc_as_system = ncalrpc_as_system;
p->mem_ctx = talloc_named(p, 0, "pipe %s %p", pipe_name, p);
if (!p->mem_ctx) {
status = make_server_info_info3(p,
info3->base.account_name.string,
info3->base.domain.string,
- &p->session_info, info3);
+ &server_info, info3);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("Failed to init server info\n"));
TALLOC_FREE(p);
* Some internal functions need a local token to determine access to
* resoutrces.
*/
- status = create_local_token(p->session_info);
+ status = create_local_token(p, server_info, &session_info->session_key, &p->session_info);
+ talloc_free(server_info);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(1, ("Failed to init local auth token\n"));
TALLOC_FREE(p);
* regardless of what we just calculated */
p->session_info->security_token = talloc_move(p->session_info, &session_info->security_token);
- /* Also set the session key to the correct value */
- p->session_info->user_session_key = session_info->session_key;
- p->session_info->user_session_key.data = talloc_move(p->session_info, &session_info->session_key.data);
-
p->client_id = talloc_zero(p, struct client_address);
if (!p->client_id) {
TALLOC_FREE(p);
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
+ dcerpc_ncacn_disconnect_fn disconnect_fn;
};
static void named_pipe_listener(struct tevent_context *ev,
char *client_name;
struct tsocket_address *server;
char *server_name;
- struct auth_session_info_transport *session_info;
+ struct auth_session_info *session_info;
struct pipes_struct *p;
static void named_pipe_accept_done(struct tevent_req *subreq)
{
+ struct auth_session_info_transport *session_info_transport;
struct named_pipe_client *npc =
tevent_req_callback_data(subreq, struct named_pipe_client);
const char *cli_addr;
&npc->client_name,
&npc->server,
&npc->server_name,
- &npc->session_info);
+ &session_info_transport);
+
+ npc->session_info = talloc_move(npc, &session_info_transport->session_info);
+
TALLOC_FREE(subreq);
if (ret != 0) {
DEBUG(2, ("Failed to accept named pipe connection! (%s)\n",
goto fail;
}
- /* And now start receaving and processing packets */
+ /* And now start receiving and processing packets */
subreq = dcerpc_read_ncacn_packet_send(npc, npc->ev, npc->tstream);
if (!subreq) {
DEBUG(2, ("Failed to start receving packets\n"));
uint16_t port,
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
- int s);
+ int s,
+ dcerpc_ncacn_disconnect_fn fn);
/********************************************************************
* Start listening on the tcp/ip socket
state->syntax_id = syntax_id;
state->fd = -1;
state->ep.port = port;
+ state->disconnect_fn = NULL;
if (state->ep.port == 0) {
uint16_t i;
int s = -1;
int rc;
- while (s == -1) {
- s = accept(state->fd, (struct sockaddr *)(void *) &addr, &in_addrlen);
- if (s == -1 && errno != EINTR) {
- break;
- }
- }
-
+ s = accept(state->fd, (struct sockaddr *)(void *) &addr, &in_addrlen);
if (s == -1) {
- DEBUG(0,("tcpip_listener accept: %s\n",
- strerror(errno)));
+ if (errno != EINTR) {
+ DEBUG(0,("tcpip_listener accept: %s\n",
+ strerror(errno)));
+ }
return;
}
state->ep.port,
cli_addr,
srv_addr,
- s);
+ s,
+ NULL);
}
/********************************************************************
bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx,
struct messaging_context *msg_ctx,
struct ndr_syntax_id syntax_id,
- const char *name)
+ const char *name,
+ dcerpc_ncacn_disconnect_fn fn)
{
struct dcerpc_ncacn_listen_state *state;
struct tevent_fd *fde;
state->syntax_id = syntax_id;
state->fd = -1;
+ state->disconnect_fn = fn;
if (name == NULL) {
name = "DEFAULT";
ZERO_STRUCT(sunaddr);
- while (sd == -1) {
- sd = accept(state->fd, addr, &len);
- if (sd == -1 && errno != EINTR) {
- break;
- }
- }
-
+ sd = accept(state->fd, addr, &len);
if (sd == -1) {
- DEBUG(0, ("ncalrpc accept() failed: %s\n", strerror(errno)));
+ if (errno != EINTR) {
+ DEBUG(0, ("ncalrpc accept() failed: %s\n", strerror(errno)));
+ }
return;
}
state->msg_ctx,
state->syntax_id, NCALRPC,
state->ep.name, 0,
- cli_addr, NULL, sd);
+ cli_addr, NULL, sd,
+ state->disconnect_fn);
}
struct dcerpc_ncacn_conn {
int sock;
struct pipes_struct *p;
+ dcerpc_ncacn_disconnect_fn disconnect_fn;
struct tevent_context *ev_ctx;
struct messaging_context *msg_ctx;
char *client_name;
struct tsocket_address *server;
char *server_name;
- struct auth_session_info_transport *session_info;
+ struct auth_session_info *session_info;
struct iovec *iov;
size_t count;
uint16_t port,
struct tsocket_address *cli_addr,
struct tsocket_address *srv_addr,
- int s) {
+ int s,
+ dcerpc_ncacn_disconnect_fn fn) {
struct dcerpc_ncacn_conn *ncacn_conn;
struct tevent_req *subreq;
const char *cli_str;
ncacn_conn->ev_ctx = ev_ctx;
ncacn_conn->msg_ctx = msg_ctx;
ncacn_conn->sock = s;
+ ncacn_conn->disconnect_fn = fn;
ncacn_conn->client = talloc_move(ncacn_conn, &cli_addr);
if (tsocket_address_is_inet(ncacn_conn->client, "ip")) {
status = dcerpc_read_ncacn_packet_recv(subreq, ncacn_conn, &pkt, &recv_buffer);
TALLOC_FREE(subreq);
if (!NT_STATUS_IS_OK(status)) {
- DEBUG(3, ("Failed to receive ncacn packet!\n"));
+ if (ncacn_conn->disconnect_fn != NULL) {
+ ok = ncacn_conn->disconnect_fn(ncacn_conn->p);
+ if (!ok) {
+ DEBUG(3, ("Failed to call disconnect function\n"));
+ }
+ }
goto fail;
}
return;
fail:
- DEBUG(2, ("Fatal error(%s). "
- "Terminating client(%s) connection!\n",
- nt_errstr(status), ncacn_conn->client_name));
+ DEBUG(3, ("Terminating client(%s) connection! - '%s'\n",
+ ncacn_conn->client_name, nt_errstr(status)));
/* Terminate client connection */
talloc_free(ncacn_conn);
{
struct dcerpc_ncacn_conn *ncacn_conn =
tevent_req_callback_data(subreq, struct dcerpc_ncacn_conn);
+ NTSTATUS status = NT_STATUS_OK;
int sys_errno;
int rc;
TALLOC_FREE(subreq);
if (rc < 0) {
DEBUG(2, ("Writev failed!\n"));
+ status = map_nt_error_from_unix(sys_errno);
goto fail;
}
ncacn_conn->tstream);
if (subreq == NULL) {
DEBUG(2, ("Failed to start receving packets\n"));
- sys_errno = ENOMEM;
+ status = NT_STATUS_NO_MEMORY;
goto fail;
}
return;
fail:
- DEBUG(2, ("Fatal error(%s). Terminating client(%s) connection!\n",
- strerror(sys_errno), ncacn_conn->client_name));
+ DEBUG(3, ("Terminating client(%s) connection! - '%s'\n",
+ ncacn_conn->client_name, nt_errstr(status)));
/* Terminate client connection */
talloc_free(ncacn_conn);