mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
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 73882e970a
)
This commit is contained in:
parent
630a77e50f
commit
989b57f783
@ -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)
|
||||
|
@ -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)
|
||||
|
88
source3/rpc_server/srv_epmapper.c
Normal file
88
source3/rpc_server/srv_epmapper.c
Normal file
@ -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));
|
||||
}
|
70
source3/rpc_server/srv_epmapper_nt.c
Normal file
70
source3/rpc_server/srv_epmapper_nt.c
Normal file
@ -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;
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ static const char *known_nt_pipes[] = {
|
||||
"\\spoolss",
|
||||
"\\netdfs",
|
||||
"\\rpcecho",
|
||||
"\\epmapper",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user