mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
the rest of the initial rpc server side infrastructure
(This used to be commit 5fb01b0ec0321724c25669151ea7c20e6ec182d0)
This commit is contained in:
parent
188b2054a8
commit
2bde98c0ee
@ -284,6 +284,9 @@ NTVFS_POSIX_OBJ = ntvfs/posix/vfs_posix.o
|
||||
SMBD_NTVFS_OBJ = ntvfs/ntvfs_base.o ntvfs/ntvfs_util.o \
|
||||
ntvfs/ntvfs_generic.o @NTVFS_STATIC@
|
||||
|
||||
SMBD_RPC_OBJ = rpc_server/dcerpc_server.o \
|
||||
rpc_server/rpc_echo.o
|
||||
|
||||
SMBD_OBJ_SRV = smbd/connection.o \
|
||||
smbd/session.o \
|
||||
smbd/password.o smbd/conn.o \
|
||||
@ -292,7 +295,7 @@ SMBD_OBJ_SRV = smbd/connection.o \
|
||||
smbd/trans2.o smbd/search.o smbd/nttrans.o \
|
||||
lib/sysacls.o lib/server_mutex.o \
|
||||
smbd/build_options.o smbd/service.o \
|
||||
smbd/rewrite.o \
|
||||
smbd/rewrite.o $(SMBD_RPC_OBJ) \
|
||||
$(SMBD_NTVFS_OBJ) @SMBD_EXTRA_OBJS@
|
||||
|
||||
PROCESS_MODEL_OBJ = smbd/process.o smbd/process_model.o smbd/process_standard.o \
|
||||
@ -395,7 +398,7 @@ LIBSMBCLIENT_OBJ = libcli/libcliclient.o libcli/libcli_compat.o \
|
||||
LIBBIGBALLOFMUD_MAJOR = 0
|
||||
|
||||
LIBBIGBALLOFMUD_OBJ = $(LIB_OBJ) $(PARAM_OBJ) $(SECRETS_OBJ) \
|
||||
$(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) \
|
||||
$(LIBSMB_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) \
|
||||
$(GROUPDB_OBJ) $(KRBCLIENT_OBJ)
|
||||
|
||||
LIBBIGBALLOFMUD_PICOBJS = $(LIBBIGBALLOFMUD_OBJ:.o=.po)
|
||||
@ -414,7 +417,6 @@ NET_OBJ1 = utils/net.o utils/net_ads.o utils/net_ads_cldap.o utils/net_help.o \
|
||||
NET_OBJ = $(NET_OBJ1) $(SECRETS_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
|
||||
$(RPC_PARSE_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
|
||||
$(PARAM_OBJ) $(LIB_OBJ) \
|
||||
$(LIBMSRPC_OBJ) $(LIBMSRPC_SERVER_OBJ) \
|
||||
$(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) $(POPT_LIB_OBJ)
|
||||
|
||||
CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) \
|
||||
@ -487,20 +489,10 @@ LOCKTEST2_OBJ = torture/locktest2.o $(LOCKING_OBJ) $(LIBSMB_OBJ) \
|
||||
SMBCACLS_OBJ = utils/smbcacls.o $(LOCKING_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
|
||||
$(PARAM_OBJ) \
|
||||
$(LIB_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ) \
|
||||
$(LIBMSRPC_OBJ) $(SECRETS_OBJ)
|
||||
$(SECRETS_OBJ)
|
||||
|
||||
TALLOCTORT_OBJ = lib/talloctort.o $(LIB_OBJ) $(PARAM_OBJ)
|
||||
|
||||
RPCTORTURE_OBJ = torture/rpctorture.o \
|
||||
rpcclient/display.o \
|
||||
rpcclient/cmd_lsarpc.o \
|
||||
rpcclient/cmd_wkssvc.o \
|
||||
rpcclient/cmd_samr.o \
|
||||
rpcclient/cmd_srvsvc.o \
|
||||
rpcclient/cmd_netlogon.o \
|
||||
$(PARAM_OBJ) $(LIBSMB_OBJ) $(LIB_OBJ) $(KRBCLIENT_OBJ) \
|
||||
$(RPC_CLIENT_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_GET_SET_OBJ)
|
||||
|
||||
DEBUG2HTML_OBJ = utils/debug2html.o ubiqx/debugparse.o
|
||||
|
||||
SMBFILTER_OBJ = utils/smbfilter.o $(LIBSMB_OBJ) $(PARAM_OBJ) \
|
||||
@ -510,8 +502,7 @@ PROTO_OBJ = $(SMBD_OBJ_SRV) \
|
||||
$(SMBD_OBJ_MAIN) $(PROCESS_MODEL_OBJ) \
|
||||
$(NMBD_OBJ1) $(SWAT_OBJ1) $(LIBSMB_OBJ) \
|
||||
$(LIBRAW_OBJ) $(LIBDFS_OBJ) $(LIBCLIUTIL) $(LIBCLIAUTH_OBJ) \
|
||||
$(SMBW_OBJ1) $(SMBWRAPPER_OBJ1) $(SMBTORTURE_OBJ1) $(RPCCLIENT_OBJ1) \
|
||||
$(LIBMSRPC_OBJ) $(LIBMSRPC_SERVER_OBJ) $(RPC_CLIENT_OBJ) \
|
||||
$(SMBW_OBJ1) $(SMBWRAPPER_OBJ1) $(SMBTORTURE_OBJ1) \
|
||||
$(RPC_PIPE_OBJ) $(RPC_PARSE_OBJ) $(KRBCLIENT_OBJ) \
|
||||
$(AUTH_OBJ) $(PARAM_OBJ) $(LOCKING_OBJ) $(SECRETS_OBJ) \
|
||||
$(PRINTING_OBJ) $(PRINTBACKEND_OBJ) $(OPLOCK_OBJ) $(NOTIFY_OBJ) \
|
||||
@ -559,7 +550,7 @@ WINBINDD_OBJ1 = \
|
||||
WINBINDD_OBJ = \
|
||||
$(WINBINDD_OBJ1) $(PASSDB_GET_SET_OBJ) \
|
||||
$(PARAM_OBJ) $(LIB_OBJ) \
|
||||
$(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(RPC_PARSE_OBJ) \
|
||||
$(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
|
||||
$(PROFILE_OBJ) $(UNIGRP_OBJ) \
|
||||
$(SECRETS_OBJ) $(LIBADS_OBJ) $(KRBCLIENT_OBJ)
|
||||
|
||||
@ -717,10 +708,6 @@ bin/swat@EXEEXT@: $(SWAT_OBJ) bin/.dummy
|
||||
@$(CC) $(FLAGS) -o $@ $(SWAT_OBJ) $(LDFLAGS) $(DYNEXP) $(PRINTLIBS) \
|
||||
$(AUTHLIBS) $(LIBS)
|
||||
|
||||
bin/rpcclient@EXEEXT@: $(RPCCLIENT_OBJ) @BUILD_POPT@ bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(RPCCLIENT_OBJ) $(LDFLAGS) $(DYNEXP) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @BUILD_POPT@
|
||||
|
||||
bin/smbclient@EXEEXT@: $(CLIENT_OBJ) @BUILD_POPT@ bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(CLIENT_OBJ) $(LDFLAGS) $(TERMLDFLAGS) $(TERMLIBS) $(LIBS) @BUILD_POPT@
|
||||
@ -963,9 +950,6 @@ bin/pam_smbpass.@SHLIBEXT@: $(PAM_SMBPASS_PICOOBJ)
|
||||
@echo "Linking shared library $@"
|
||||
$(SHLD) $(LDSHFLAGS) -o $@ $(PAM_SMBPASS_PICOOBJ) -lpam $(DYNEXP) $(LIBS) -lc
|
||||
|
||||
bin/libmsrpc.a: $(LIBMSRPC_PICOBJ)
|
||||
-$(AR) -rc $@ $(LIBMSRPC_PICOBJ)
|
||||
|
||||
bin/tdbbackup@EXEEXT@: $(TDBBACKUP_OBJ) bin/.dummy
|
||||
@echo Linking $@
|
||||
@$(CC) $(FLAGS) -o $@ $(TDBBACKUP_OBJ)
|
||||
@ -1014,7 +998,7 @@ installclientlib:
|
||||
# Python extensions
|
||||
|
||||
PYTHON_OBJS = $(LIB_OBJ) $(LIBSMB_OBJ) $(RPC_PARSE_OBJ) \
|
||||
$(PARAM_OBJ) $(LIBMSRPC_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
|
||||
$(PARAM_OBJ) $(PASSDB_OBJ) $(GROUPDB_OBJ) \
|
||||
$(SECRETS_OBJ) $(KRBCLIENT_OBJ)
|
||||
|
||||
python_ext: $(PYTHON_OBJS)
|
||||
|
@ -331,6 +331,8 @@ struct server_context {
|
||||
|
||||
struct timers_context timers;
|
||||
|
||||
struct dcesrv_context dcesrv;
|
||||
|
||||
/* the pid of the process handling this session */
|
||||
pid_t pid;
|
||||
|
||||
|
@ -773,28 +773,6 @@ extern int errno;
|
||||
#include "librpc/ndr/libndr.h"
|
||||
#include "librpc/rpc/dcerpc.h"
|
||||
|
||||
/*
|
||||
* Type for wide character dirent structure.
|
||||
* Only d_name is defined by POSIX.
|
||||
*/
|
||||
|
||||
typedef struct smb_wdirent {
|
||||
wpstring d_name;
|
||||
} SMB_STRUCT_WDIRENT;
|
||||
|
||||
/*
|
||||
* Type for wide character passwd structure.
|
||||
*/
|
||||
|
||||
typedef struct smb_wpasswd {
|
||||
wfstring pw_name;
|
||||
char *pw_passwd;
|
||||
uid_t pw_uid;
|
||||
gid_t pw_gid;
|
||||
wpstring pw_gecos;
|
||||
wpstring pw_dir;
|
||||
wpstring pw_shell;
|
||||
} SMB_STRUCT_WPASSWD;
|
||||
|
||||
/* used in net.c */
|
||||
struct functable {
|
||||
@ -803,20 +781,8 @@ struct functable {
|
||||
};
|
||||
|
||||
|
||||
/* Defines for wisXXX functions. */
|
||||
#define UNI_UPPER 0x1
|
||||
#define UNI_LOWER 0x2
|
||||
#define UNI_DIGIT 0x4
|
||||
#define UNI_XDIGIT 0x8
|
||||
#define UNI_SPACE 0x10
|
||||
|
||||
#include "nsswitch/nss.h"
|
||||
|
||||
/* forward declaration from printing.h to get around
|
||||
header file dependencies */
|
||||
|
||||
struct printjob;
|
||||
|
||||
/***** automatically generated prototypes *****/
|
||||
#include "proto.h"
|
||||
|
||||
@ -832,23 +798,6 @@ struct printjob;
|
||||
#define QSORT_CAST (int (*)(const void *, const void *))
|
||||
#endif
|
||||
|
||||
#ifndef DEFAULT_PRINTING
|
||||
#ifdef HAVE_CUPS
|
||||
#define DEFAULT_PRINTING PRINT_CUPS
|
||||
#define PRINTCAP_NAME "cups"
|
||||
#elif defined(SYSV)
|
||||
#define DEFAULT_PRINTING PRINT_SYSV
|
||||
#define PRINTCAP_NAME "lpstat"
|
||||
#else
|
||||
#define DEFAULT_PRINTING PRINT_BSD
|
||||
#define PRINTCAP_NAME "/etc/printcap"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef PRINTCAP_NAME
|
||||
#define PRINTCAP_NAME "/etc/printcap"
|
||||
#endif
|
||||
|
||||
#ifndef SIGCLD
|
||||
#define SIGCLD SIGCHLD
|
||||
#endif
|
||||
|
@ -421,6 +421,7 @@ struct vuid_cache {
|
||||
#include "smb_acls.h"
|
||||
#include "enums.h"
|
||||
#include "events.h"
|
||||
#include "rpc_server/dcerpc_server.h"
|
||||
#include "context.h"
|
||||
#include "smb_interfaces.h"
|
||||
#include "ntvfs.h"
|
||||
|
@ -309,7 +309,7 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe **p,
|
||||
union smb_open io;
|
||||
TALLOC_CTX *mem_ctx;
|
||||
|
||||
asprintf(&name, "\\%s", pipe_name);
|
||||
asprintf(&name, "\\pipe\\%s", pipe_name);
|
||||
if (!name) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
@ -25,16 +25,102 @@
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
/* this is the private structure used to keep the state of an open
|
||||
ipc$ connection. It needs to keep information about all open
|
||||
pipes */
|
||||
struct ipc_private {
|
||||
|
||||
uint16 next_fnum;
|
||||
uint16 num_open;
|
||||
|
||||
/* a list of open pipes */
|
||||
struct pipe_state {
|
||||
struct pipe_state *next, *prev;
|
||||
TALLOC_CTX *mem_ctx;
|
||||
const char *pipe_name;
|
||||
uint16 fnum;
|
||||
struct dcesrv_state *pipe_state;
|
||||
} *pipe_list;
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
find the next fnum available on this connection
|
||||
*/
|
||||
static uint16 find_next_fnum(struct ipc_private *ipc)
|
||||
{
|
||||
struct pipe_state *p;
|
||||
uint32 ret;
|
||||
|
||||
if (ipc->num_open == 0xFFFF) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
again:
|
||||
ret = ipc->next_fnum++;
|
||||
|
||||
for (p=ipc->pipe_list; p; p=p->next) {
|
||||
if (p->fnum == ret) {
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
shutdown a single pipe. Called on a close or disconnect
|
||||
*/
|
||||
static void pipe_shutdown(struct ipc_private *private, struct pipe_state *p)
|
||||
{
|
||||
TALLOC_CTX *mem_ctx = private->pipe_list->mem_ctx;
|
||||
dcesrv_endpoint_disconnect(private->pipe_list->pipe_state);
|
||||
DLIST_REMOVE(private->pipe_list, private->pipe_list);
|
||||
talloc_destroy(mem_ctx);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
find a open pipe give a file descriptor
|
||||
*/
|
||||
static struct pipe_state *pipe_state_find(struct ipc_private *private, uint16 fnum)
|
||||
{
|
||||
struct pipe_state *p;
|
||||
|
||||
for (p=private->pipe_list; p; p=p->next) {
|
||||
if (p->fnum == fnum) {
|
||||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
connect to a share - always works
|
||||
*/
|
||||
static NTSTATUS ipc_connect(struct request_context *req, const char *sharename)
|
||||
{
|
||||
struct tcon_context *conn = req->conn;
|
||||
struct ipc_private *private;
|
||||
|
||||
conn->fs_type = talloc_strdup(conn->mem_ctx, "IPC");
|
||||
conn->dev_type = talloc_strdup(conn->mem_ctx, "IPC");
|
||||
|
||||
/* prepare the private state for this connection */
|
||||
private = talloc(conn->mem_ctx, sizeof(struct ipc_private));
|
||||
if (!private) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
conn->ntvfs_private = (void *)private;
|
||||
|
||||
private->pipe_list = NULL;
|
||||
private->next_fnum = 1;
|
||||
private->num_open = 0;
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
@ -43,6 +129,13 @@ static NTSTATUS ipc_connect(struct request_context *req, const char *sharename)
|
||||
*/
|
||||
static NTSTATUS ipc_disconnect(struct tcon_context *tcon)
|
||||
{
|
||||
struct ipc_private *private = tcon->ntvfs_private;
|
||||
|
||||
/* close any pipes that are open. Discard any unread data */
|
||||
while (private->pipe_list) {
|
||||
pipe_shutdown(private, private->pipe_list);
|
||||
}
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
@ -88,11 +181,79 @@ static NTSTATUS ipc_setpathinfo(struct request_context *req, union smb_setfilein
|
||||
}
|
||||
|
||||
/*
|
||||
open a file
|
||||
open a file - used for MSRPC pipes
|
||||
*/
|
||||
static NTSTATUS ipc_open(struct request_context *req, union smb_open *oi)
|
||||
{
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
struct pipe_state *p;
|
||||
TALLOC_CTX *mem_ctx;
|
||||
NTSTATUS status;
|
||||
struct dcesrv_endpoint endpoint;
|
||||
struct ipc_private *private = req->conn->ntvfs_private;
|
||||
|
||||
/* for now only handle NTcreateX style opens */
|
||||
if (oi->generic.level != RAW_OPEN_NTCREATEX) {
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
mem_ctx = talloc_init("ipc_open '%s'", oi->ntcreatex.in.fname);
|
||||
if (!mem_ctx) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
p = talloc(mem_ctx, sizeof(struct pipe_state));
|
||||
if (!p) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
p->mem_ctx = mem_ctx;
|
||||
|
||||
p->pipe_name = talloc_strdup(mem_ctx, oi->ntcreatex.in.fname);
|
||||
if (!p->pipe_name) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
|
||||
p->fnum = find_next_fnum(private);
|
||||
if (p->fnum == 0) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return NT_STATUS_TOO_MANY_OPENED_FILES;
|
||||
}
|
||||
|
||||
if (strncasecmp(p->pipe_name, "\\pipe\\", 6) != 0) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return NT_STATUS_OBJECT_NAME_NOT_FOUND;
|
||||
}
|
||||
p->pipe_name += 6;
|
||||
|
||||
/*
|
||||
we're all set, now ask the dcerpc server subsystem to open the
|
||||
endpoint. At this stage the pipe isn't bound, so we don't
|
||||
know what interface the user actually wants, just that they want
|
||||
one of the interfaces attached to this pipe endpoint.
|
||||
|
||||
TODO: note that we aren't passing any credentials here. We
|
||||
will need to do that once the credentials infrastructure is
|
||||
finalised for Samba4
|
||||
*/
|
||||
|
||||
endpoint.type = ENDPOINT_SMB;
|
||||
endpoint.info.smb_pipe = p->pipe_name;
|
||||
|
||||
status = dcesrv_endpoint_connect(req->smb, &endpoint, &p->pipe_state);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
talloc_destroy(mem_ctx);
|
||||
return status;
|
||||
}
|
||||
|
||||
private->num_open++;
|
||||
|
||||
DLIST_ADD(private->pipe_list, p);
|
||||
|
||||
ZERO_STRUCT(oi->ntcreatex.out);
|
||||
oi->ntcreatex.out.fnum = p->fnum;
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -164,7 +325,22 @@ static NTSTATUS ipc_flush(struct request_context *req, struct smb_flush *io)
|
||||
*/
|
||||
static NTSTATUS ipc_close(struct request_context *req, union smb_close *io)
|
||||
{
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
struct ipc_private *private = req->conn->ntvfs_private;
|
||||
struct pipe_state *p;
|
||||
|
||||
if (io->generic.level != RAW_CLOSE_CLOSE) {
|
||||
return NT_STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
p = pipe_state_find(private, io->close.in.fnum);
|
||||
if (!p) {
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
pipe_shutdown(private, p);
|
||||
private->num_open--;
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -762,6 +762,9 @@ void init_smbsession(struct event_context *ev, struct model_ops *model_ops, int
|
||||
fde.flags = EVENT_FD_READ;
|
||||
|
||||
event_add_fd(ev, &fde);
|
||||
|
||||
/* setup the DCERPC server subsystem */
|
||||
dcesrv_init(smb);
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user