From 989b57f783adada15db645f60e9aafc3e83cc6ce Mon Sep 17 00:00:00 2001 From: Jim McDonough Date: Tue, 21 Oct 2003 17:59:08 +0000 Subject: Add server side support for epmapper pipe. Currently only does a fixed mapping, but this is the base for changes to come. (This used to be commit 73882e970a3aea1c3c9f34779b4220bbf28f6dad) --- source3/Makefile.in | 14 ++++-- source3/configure.in | 4 +- source3/rpc_server/srv_epmapper.c | 88 ++++++++++++++++++++++++++++++++++++ source3/rpc_server/srv_epmapper_nt.c | 70 ++++++++++++++++++++++++++++ source3/rpc_server/srv_pipe.c | 3 ++ source3/smbd/nttrans.c | 1 + 6 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 source3/rpc_server/srv_epmapper.c create mode 100644 source3/rpc_server/srv_epmapper_nt.c (limited to 'source3') diff --git a/source3/Makefile.in b/source3/Makefile.in index a02bd751c8..10c07d05eb 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -264,6 +264,8 @@ RPC_PIPE_OBJ = rpc_server/srv_pipe_hnd.o rpc_server/srv_util.o \ RPC_ECHO_OBJ = rpc_server/srv_echo.o rpc_server/srv_echo_nt.o +RPC_EPMAPPER_OBJ = rpc_server/srv_epmapper.o rpc_server/srv_epmapper_nt.o + RPC_SERVER_OBJ = @RPC_STATIC@ $(RPC_PIPE_OBJ) # this includes only the low level parse code, not stuff @@ -580,9 +582,10 @@ PROTO_OBJ = $(SMBD_OBJ_MAIN) \ $(PASSDB_OBJ) $(GROUPDB_OBJ) $(MSDFS_OBJ) \ $(READLINE_OBJ) $(PROFILE_OBJ) $(LIBADS_OBJ) $(LIBADS_SERVER_OBJ) \ $(LIB_SMBD_OBJ) $(SAM_OBJ) $(REGISTRY_OBJ) $(POPT_LIB_OBJ) \ - $(RPC_LSA_OBJ) $(RPC_NETLOG_OBJ) $(RPC_SAMR_OBJ) $(RPC_REG_OBJ) $(RPC_LSA_DS_OBJ) \ - $(RPC_SVC_OBJ) $(RPC_WKS_OBJ) $(RPC_DFS_OBJ) $(RPC_SPOOLSS_OBJ) \ - $(RPC_ECHO_OBJ) $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o + $(RPC_LSA_OBJ) $(RPC_NETLOG_OBJ) $(RPC_SAMR_OBJ) $(RPC_REG_OBJ) \ + $(RPC_LSA_DS_OBJ) $(RPC_SVC_OBJ) $(RPC_WKS_OBJ) $(RPC_DFS_OBJ) \ + $(RPC_SPOOLSS_OBJ) $(RPC_ECHO_OBJ) $(RPC_EPMAPPER_OBJ) \ + $(SMBLDAP_OBJ) $(IDMAP_OBJ) libsmb/spnego.o WINBIND_WINS_NSS_OBJ = nsswitch/wins.o $(PARAM_OBJ) $(UBIQX_OBJ) \ $(LIBSMB_OBJ) $(LIB_OBJ) $(NSSWINS_OBJ) $(KRBCLIENT_OBJ) @@ -1005,6 +1008,11 @@ bin/librpc_echo.@SHLIBEXT@: $(RPC_ECHO_OBJ) @$(SHLD) $(LDSHFLAGS) -o $@ $(RPC_ECHO_OBJ) -lc \ @SONAMEFLAG@`basename $@` +bin/librpc_epmapper.@SHLIBEXT@: $(RPC_EPMAPPER_OBJ) + @echo "Linking $@" + @$(SHLD) $(LDSHFLAGS) -o $@ $(RPC_EPMAPPER_OBJ) -lc \ + @SONAMEFLAG@`basename $@` + bin/winbindd@EXEEXT@: $(WINBINDD_OBJ) @BUILD_POPT@ bin/.dummy @echo "Linking $@" @$(LINK) -o $@ $(WINBINDD_OBJ) $(DYNEXP) $(LIBS) @POPTLIBS@ $(KRB5LIBS) $(LDAP_LIBS) diff --git a/source3/configure.in b/source3/configure.in index 16b0760802..01c71b3149 100644 --- a/source3/configure.in +++ b/source3/configure.in @@ -296,7 +296,7 @@ DYNEXP= dnl Add modules that have to be built by default here dnl These have to be built static: -default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_lsa_ds rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin pdb_gums gums_tdbsam2" +default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_lsa_ds rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss rpc_epmapper auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin pdb_gums gums_tdbsam2" dnl These are preferably build shared, and static if dlopen() is not available default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap charset_CP850 charset_CP437" @@ -4128,6 +4128,8 @@ SMB_MODULE(rpc_srv, \$(RPC_SVC_OBJ), "bin/librpc_srvsvc.$SHLIBEXT", RPC) SMB_MODULE(rpc_spoolss, \$(RPC_SPOOLSS_OBJ), "bin/librpc_spoolss.$SHLIBEXT", RPC) SMB_MODULE(rpc_samr, \$(RPC_SAMR_OBJ), "bin/librpc_samr.$SHLIBEXT", RPC) SMB_MODULE(rpc_echo, \$(RPC_ECHO_OBJ), "bin/librpc_echo.$SHLIBEXT", RPC) +SMB_MODULE(rpc_epmapper, \$(RPC_EPMAPPER_OBJ), "bin/librpc_epmapper.$SHLIBEXT", + RPC) SMB_SUBSYSTEM(RPC,smbd/server.o) SMB_MODULE(idmap_ldap, sam/idmap_ldap.o, "bin/idmap_ldap.$SHLIBEXT", IDMAP) diff --git a/source3/rpc_server/srv_epmapper.c b/source3/rpc_server/srv_epmapper.c new file mode 100644 index 0000000000..70de092850 --- /dev/null +++ b/source3/rpc_server/srv_epmapper.c @@ -0,0 +1,88 @@ + +/* + Unix SMB/CIFS implementation. + Samba end point mapper utility and mapping functions + Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/***************************************************************** + api_handle_map_req - handles standard epm mapping request +******************************************************************/ +static BOOL api_handle_map_req(pipes_struct * p) +{ + + EPM_Q_MAP q_in; + EPM_R_MAP q_out; + + prs_struct *in_data = &p->in_data.data; + prs_struct *ret_data = &p->out_data.rdata; + + ZERO_STRUCT(q_in); + ZERO_STRUCT(q_out); + + /* process input request and parse packet */ + + if (!epm_io_q_map("", &q_in, in_data, 0)) { + DEBUG(0, + ("api_handle_map_request: unable to unmarshall EPMD_MAP\n")); + return False; + } + + _epm_map(p, &q_in, &q_out); + + if (!epm_io_r_map("", &q_out, ret_data, 0)) { + DEBUG(0, + ("api_handle_map_req: unable to marshall EPMD_MAP\n")); + return False; + } + + return True; +} + +/*******************************************************************/ +/* \pipe\epmapper commands */ +/*******************************************************************/ +/* opnum is 3 on map request */ + +struct api_struct api_epmapper_cmds[] = { + {"MAP_PIPE_NAME", EPM_MAP_PIPE_NAME, api_handle_map_req}, +}; + +/*******************************************************************/ +/* */ +/*******************************************************************/ + +void epm_get_pipe_fns(struct api_struct **funcs, int *n_funcs) +{ + *funcs = api_epmapper_cmds; + *n_funcs = sizeof(api_epmapper_cmds) / sizeof(struct api_struct); +} + +/*******************************************************************/ +/* */ +/*******************************************************************/ + +NTSTATUS rpc_epmapper_init(void) +{ + return rpc_pipe_register_commands(SMB_RPC_INTERFACE_VERSION, + EPM_PIPE_NM, EPM_PIPE_NM, + api_epmapper_cmds, + sizeof(api_epmapper_cmds) / + sizeof(struct api_struct)); +} diff --git a/source3/rpc_server/srv_epmapper_nt.c b/source3/rpc_server/srv_epmapper_nt.c new file mode 100644 index 0000000000..1b72a5ed41 --- /dev/null +++ b/source3/rpc_server/srv_epmapper_nt.c @@ -0,0 +1,70 @@ + +/* + Unix SMB/CIFS implementation. + Samba end point mapper utility and mapping functions + Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +/*******************************************************************/ +/* _epm_map - fill out mapping on input and output structs */ +/*******************************************************************/ +void _epm_map(pipes_struct *ps, const EPM_Q_MAP *q_u, EPM_R_MAP *r_u) +{ + int i; + uint8 target_address[] = { 9, 53, 95, 27 }; + EPM_FLOOR *floors = talloc(ps->mem_ctx, sizeof(EPM_FLOOR) * + q_u->tower->num_floors); + EPM_TOWER *towers = talloc(ps->mem_ctx, + sizeof(EPM_TOWER) * MAX_TOWERS); + EPM_TOWER_ARRAY array; + + if (!floors || !towers) { + DEBUG(0, ("_epm_map: talloc failed!\n")); + return; + } + + for (i = 0; i < q_u->tower->num_floors; i++) { + switch (q_u->tower->floors[i].lhs.protocol) { + case EPM_FLOOR_UUID: + init_epm_floor_uuid(&floors[i], + &q_u->tower->floors[i]. + lhs.uuid.uuid, + q_u->tower->floors[i]. + lhs.uuid.version); + break; + case EPM_FLOOR_RPC: + init_epm_floor_rpc(&floors[i]); + break; + case EPM_FLOOR_TCP: + /* for now map all requests to port 135 */ + init_epm_floor_tcp(&floors[i], 135); + break; + case EPM_FLOOR_IP: + init_epm_floor_ip(&floors[i], target_address); + break; + } + } + + init_epm_tower(ps->mem_ctx, &towers[0], floors, 5); + init_epm_tower_array(ps->mem_ctx, &array, towers, 1); + init_epm_r_map(ps->mem_ctx, r_u, &q_u->term_handle, &array, 1, 0); + + return; + +} diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c index 96261c665f..444c35987a 100644 --- a/source3/rpc_server/srv_pipe.c +++ b/source3/rpc_server/srv_pipe.c @@ -1603,6 +1603,9 @@ void get_pipe_fns( int idx, struct api_struct **fns, int *n_fns ) echo_get_pipe_fns( &cmds, &n_cmds ); break; #endif + case PI_EPM: + epm_get_pipe_fns( &cmds, &n_cmds ); + break; default: DEBUG(0,("get_pipe_fns: Unknown pipe index! [%d]\n", idx)); } diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index 19af61f190..e7d7c20f6b 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -43,6 +43,7 @@ static const char *known_nt_pipes[] = { "\\spoolss", "\\netdfs", "\\rpcecho", + "\\epmapper", NULL }; -- cgit