The branch, v4-21-stable has been updated
via 5da3e988292 VERSION: Disable GIT_SNAPSHOT for the 4.21.7 release.
via 19f7837e498 WHATSNEW: Add release notes for Samba 4.21.7.
via 1967ce81998 s3-winbindd: Fix internal winbind dsgetdcname calls
w.r.t. domain name
via fc13e0918fd s3:winbindd: avoid using any netlogon call to get a dc
name
via 3490e76342a lib:util: Disable logging to syslog for startup messages
via ccb5e9694e3 python:lsa_utils: Fix fallback to OpenPolicy2
via b106c7d77ae python:lsa_utils: Don't use optional arguments for
OpenPolicyFallback()
via e8e6b68539b pidl: Update documentation for DCERPC interface
connections
via 0a0d87f4093 librpc:pyrpc: Allow new authenticated rpc connection on
the same transport as the basis_connection
via 30b077b6781 dcesrv_core: Make dcesrv_call_disconnect_after() public
via 1cbbe56266b s3:rpc_client: Use cli_rpc_pipe_reopen_np_noauth() for
OpenPolicy fallback
via 4ae32d6faa0 s3:rpc_cerver: Use dcerpc_lsa_open_policy3() for
internal RPC
via fe5b8928443 s3:rpc_client: Add cli_rpc_pipe_reopen_np_noauth()
via 1ba2acc9fc9 s3:cli_pipe: pass target_service to
cli_rpc_pipe_open_with_creds()
via 22900d278cb s3:rpc_client: remember the local/remote ipv4 or ipv6
addresses
via e568b119340 s3:rpc_client: add missing TALLOC_FREE(frame) in
cli_rpc_pipe_open()
via 4ead8424471 s3:rpc_client: split out
cli_rpc_pipe_client_auth_schannel()
via bf717ca5c4d s3:rpc_client: add cli_rpc_pipe_client_prepare_alter()
helper
via 75e1c18d912 s3:rpc_client: make real use of
rpc_client_{association,connection}
via cb3e074ec54 s3:rpc_client: let cli_rpc_pipe_open() use
rpc_client_connection_np()
via 4b1f27c3202 s3:rpc_client: convert rpc_pipe_open_np() to
rpc_client_{association,connection}
via f019fa98dbf s3:rpc_client: convert rpc_pipe_open_tcp_port() to
rpc_client_{association,connection}
via f81ee3b6d0f s3:rpc_client: convert rpc_pipe_open_local_np() to
rpc_client_{association,connection}
via 6f67e05fb70 s3:rpc_client: convert rpc_pipe_open_ncalrpc() to
rpc_client_{association,connection}
via 8dc83405eeb s3:rpc_client: add struct
rpc_client_{association,connection} and helpers
via e42835a2f5f s3:rpc_client: only pass the pipe_name to
rpc_transport_np_init_send()
via 7e02cf063ac s3:rpc_client: make most of rpc_pipe_client internal
struct members
via 6c43234a06b s3:librpc/rpc: split out dcerpc_internal.h for struct
pipe_auth_data
via 6af9f50396d s3:libsmb: make use of
dcerpc_binding_get_abstract_syntax()
via 33b0b4bfe5f s3:lib/netapi: make use of
dcerpc_binding_get_abstract_syntax()
via 61a5a72a3cd s3:rpcclient: make use of
dcerpc_binding_handle_get_transport()
via 523484d1882 s3:winbindd: make use of
dcerpc_binding_handle_get_transport()
via 86e27e94b2b s3:rpc_client: remove references to rpc_pipe_client
from wsp_cli.c
via 2f753ed81ce s3:rpc_client: remember rpc_pipe_client->print_username
via 91e8d63c638 s4:librpc: make all but dcerpc_pipe->binding_handle
internal struct members
via ba777ee0532 s4:torture/rpc: make use of
dcerpc_binding_handle_get_transport()
via a57ec7313cd s4:tortore/rpc: make use of
dcerpc_binding_get_abstract_syntax() and dcerpc_binding_get_flags()
via 087ccbdd863 s4:torture/rpc: make use of
dcerpc_binding_handle_get_binding() and dcerpc_binding_get_flags()
via 2ca22d00411 s4:libnet: make use of
dcerpc_binding_handle_get_transport()
via 5e2606c5ea3 s4:libnet: make use of
dcerpc_binding_handle_get_binding()
via 2edaf617e86 librpc/rpc: un-const dcerpc_default_transport_endpoint()
via 57d161d54f0 librpc/rpc: add dcerpc_binding_handle_get_transport()
helper function
via e94025e1a8e librpc/rpc: add dcerpc_binding_handle_get_binding()
via bac9282844a s3:rpc_client: implement rpccli_bh_get_binding()
via 1ed6f5c6692 s4:librpc/rpc: implement dcerpc_bh_get_binding()
via d2d951bddd4 s4:librpc/rpc: call dcerpc_binding_set_abstract_syntax
after bind or alter context
via a89c2664f68 s3:winbindd: implement wbint_bh_get_binding() in
winbindd_dual_ndr.c
via 296b5cd0665 s4:lib/messaging: implement irpc_bh_get_binding()
via 51dc661d261 libcli/tstream_binding_handle: implement get_binding()
via 20a42d2ca1b librpc/rpc: add get_binding() to
dcerpc_binding_handle_ops
via 3731bbfdc4a s3:rpc_client: header signing is negotiated per
transport connection
via daefb7b2436 s3:rpc_client: make use of struct samba_sockaddr in
rpc_pipe_open_ncalrpc()
via 3db4cfe8a33 s3:winbindd: cm_connect_lsa_tcp() doesn't need to check
for NCACN_IP_TCP or LEVEL_INTEGRITY
via 1ff49833b6e s3:rpcclient: make use of
dcerpc_binding_handle_auth_info()
via 277f9ff99a8 s3:rpc_client: the transport_session_key is per
connection!
via b640002afd6 s3:rpc_client: remove unused cli_get_session_key()
via 95f7152911a s3:rpcclient/cli_drsuapi: make use of
dcerpc_binding_handle_auth_session_key()
via 3200bd21d4d s3:libnet_dssync: make use of
dcerpc_binding_handle_auth_session_key()
via 8c695f13b6b s3:rpc_client: make use of
dcerpc_binding_handle_transport_session_key()
via 5f1f651d0e5 s3:utils/net_rpc: make use of
dcerpc_binding_handle_transport_session_key()
via 505775ba876 s3:libnet_join: make use of
dcerpc_binding_handle_transport_session_key()
via 7092b9abf1d s3:lib/netapi: make use of
dcerpc_binding_handle_transport_session_key()
via c924b4420de s4:torture/drs: make use of
dcerpc_binding_handle_auth_session_key()
via c1875485f4b s4:pyrpc: make use of
dcerpc_binding_handle_auth_session_key()
via dd0c6b46880 s4:py_net: make use of
dcerpc_binding_handle_auth_session_key()
via 37768515a52 s4:libnet: make use of
dcerpc_binding_handle_auth_session_key() in libnet_become_dc.c
via 7fae08c9dcd s4:drepl: make use of
dcerpc_binding_handle_auth_session_key()
via 2b7ae6f61af s3:rpc_client: add rpccli_bh_auth_session_key()
via 0c0f83127cb s4:librpc/rpc: add dcerpc_bh_auth_session_key()
via ece818eb50c librpc/rpc: add dcerpc_binding_handle_auth_session_key()
via a835a9b2f58 s4:librpc/rpc: remove unused dcerpc_fetch_session_key()
via 21882daef2e s4:torture/rpc: make use of
dcerpc_binding_handle_transport_session_key()
via 1fe021a0c41 xss4:pyrpc: make use of
dcerpc_binding_handle_transport_session_key()
via 9aa2be36397 s4:libnet: make use of
dcerpc_binding_handle_transport_session_key() in libnet_passwd.c
via 0b5624e50d3 s4:libnet: add struct dcerpc_binding_handle helper
variables in libnet_passwd.c
via b1be2bb12d9 s4:librpc/rpc: remove unused
dcerpc_transport_encrypted()
via 7e5ac988114 s4:pyrpc: let py_iface_transport_encrypted() use
dcerpc_binding_handle_transport_encrypted()
via 30134801b6d s3:rpc_client: add rpccli_bh_transport_session_key()
via f596c49585f s4:librpc/rpc: add
dcerpc_bh_transport_{encrypted,session_key}()
via c4990ed56f7 librpc/rpc: add
dcerpc_binding_handle_transport_{encrypted,session_key}()
via b7cd9cf02aa s4:torture/rpc: avoid using DCERPC_NDR_REF_ALLOC in
fsrvp.c
via 5047e9863b9 s4:torture/rpc: remove useless usage of DCERPC_SIGN,
DCERPC_SEAL
via 59c5354117c s4:torture/rpc: avoid checking p->last_fault_code in
iremotewinspool*
via a91f4b27c18 librpc/rpc: map DCERPC_NCA_S_UNSUPPORTED_TYPE to
NT_STATUS_RPC_UNSUPPORTED_TYPE
via 27b0b2c2dde librpc/rpc: map DCERPC_NCA_S_SERVER_TOO_BUSY to
NT_STATUS_RPC_SERVER_TOO_BUSY
via a3e57f9df27 VERSION: Bump version up to Samba 4.21.7...
from b901f39a1d0 VERSION: Disable GIT_SNAPSHOT for the 4.21.6 release.
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-21-stable
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
VERSION | 2 +-
WHATSNEW.txt | 85 +-
lib/util/debug.c | 15 +
lib/util/debug.h | 9 +
.../tstream_binding_handle.c | 19 +
librpc/rpc/binding_handle.c | 44 +
librpc/rpc/dcerpc_error.c | 4 +-
librpc/rpc/dcerpc_util.c | 8 +-
librpc/rpc/dcerpc_util.h | 6 +-
librpc/rpc/dcesrv_core.c | 4 +-
librpc/rpc/dcesrv_core.h | 3 +
librpc/rpc/rpc_common.h | 26 +
pidl/lib/Parse/Pidl/Samba4/Python.pm | 29 +-
python/samba/lsa_utils.py | 67 +-
python/samba/netcmd/domain/trust.py | 93 +-
python/samba/tests/dcerpc/lsa_utils.py | 51 +-
source3/lib/netapi/cm.c | 15 +-
source3/lib/netapi/joindomain.c | 12 +-
source3/lib/netapi/localgroup.c | 2 +-
source3/lib/netapi/user.c | 6 +-
source3/libnet/libnet_dssync.c | 17 +-
source3/libnet/libnet_join.c | 3 +-
source3/librpc/rpc/dcerpc.h | 17 +-
source3/librpc/rpc/dcerpc_helpers.c | 1 +
.../librpc/rpc/dcerpc_internal.h | 22 +-
source3/libsmb/libsmb_xattr.c | 10 +-
source3/libsmb/passchange.c | 1 +
source3/rpc_client/cli_lsarpc.c | 15 +-
source3/rpc_client/cli_lsarpc.h | 4 +-
source3/rpc_client/cli_pipe.c | 1781 +++++++++++++++-----
source3/rpc_client/cli_pipe.h | 21 +-
source3/rpc_client/cli_spoolss.c | 6 +-
source3/rpc_client/rpc_client.h | 39 +-
source3/rpc_client/rpc_transport.h | 2 +-
source3/rpc_client/rpc_transport_np.c | 5 +-
source3/rpc_client/wsp_cli.c | 71 +-
source3/rpc_server/netlogon/srv_netlog_nt.c | 2 +-
source3/rpcclient/cmd_drsuapi.c | 15 +-
source3/rpcclient/cmd_iremotewinspool.c | 3 +-
source3/rpcclient/cmd_lsarpc.c | 75 +-
source3/rpcclient/cmd_samr.c | 3 +-
source3/rpcclient/rpcclient.c | 26 +-
source3/utils/net_rpc.c | 13 +-
source3/utils/net_rpc_printer.c | 3 +-
source3/utils/net_rpc_rights.c | 4 +-
source3/utils/net_rpc_trust.c | 5 +-
source3/winbindd/wb_queryuser.c | 17 +-
source3/winbindd/wb_sids2xids.c | 17 +-
source3/winbindd/wb_xids2sids.c | 12 +-
source3/winbindd/winbindd_cm.c | 158 +-
source3/winbindd/winbindd_dual.c | 6 +-
source3/winbindd/winbindd_dual_ndr.c | 47 +-
source3/winbindd/winbindd_dual_srv.c | 105 +-
source3/winbindd/winbindd_msrpc.c | 4 +-
source3/winbindd/winbindd_proto.h | 1 +
source3/winbindd/winbindd_rpc.c | 7 +-
source3/winbindd/winbindd_util.c | 19 +
source3/wscript_build | 2 +-
source4/dsdb/repl/drepl_out_helpers.c | 7 +-
source4/lib/messaging/messaging.c | 44 +-
source4/libnet/libnet_become_dc.c | 29 +-
source4/libnet/libnet_join.c | 3 +-
source4/libnet/libnet_passwd.c | 55 +-
source4/libnet/libnet_rpc.c | 27 +-
source4/libnet/py_net.c | 12 +-
source4/librpc/rpc/dcerpc.c | 121 ++
source4/librpc/rpc/dcerpc.h | 22 +-
source4/librpc/rpc/dcerpc_auth.c | 2 +
source4/librpc/rpc/dcerpc_connect.c | 1 +
source4/librpc/rpc/dcerpc_roh.c | 2 +
source4/librpc/rpc/dcerpc_schannel.c | 2 +
source4/librpc/rpc/dcerpc_secondary.c | 1 +
source4/librpc/rpc/dcerpc_smb.c | 2 +
source4/librpc/rpc/dcerpc_sock.c | 2 +
source4/librpc/rpc/dcerpc_util.c | 34 +-
source4/librpc/rpc/pyrpc.c | 50 +-
source4/librpc/rpc/pyrpc_util.c | 80 +-
source4/rpc_server/remote/dcesrv_remote.c | 2 +
source4/torture/drs/rpc/dssync.c | 5 +-
source4/torture/drs/rpc/msds_intid.c | 5 +-
source4/torture/rpc/alter_context.c | 36 +-
source4/torture/rpc/backupkey.c | 9 +-
source4/torture/rpc/bind.c | 4 +-
source4/torture/rpc/drsuapi.c | 5 +-
source4/torture/rpc/dsgetinfo.c | 4 +-
source4/torture/rpc/echo.c | 17 +-
source4/torture/rpc/forest_trust.c | 5 +-
source4/torture/rpc/fsrvp.c | 72 +-
source4/torture/rpc/handles.c | 28 +-
source4/torture/rpc/iremotewinspool.c | 22 +-
source4/torture/rpc/iremotewinspool_common.c | 4 -
source4/torture/rpc/iremotewinspool_common.h | 1 -
source4/torture/rpc/lsa.c | 22 +-
source4/torture/rpc/lsa_lookup.c | 5 +-
source4/torture/rpc/netlogon.c | 30 +-
source4/torture/rpc/samba3rpc.c | 19 +-
source4/torture/rpc/samr.c | 24 +-
source4/torture/rpc/samsync.c | 6 +-
source4/torture/rpc/session_key.c | 4 +-
source4/torture/rpc/spoolss.c | 4 +-
source4/torture/rpc/testjoin.c | 2 +-
source4/torture/rpc/winreg.c | 8 +-
source4/torture/rpc/wkssvc.c | 4 +-
103 files changed, 2649 insertions(+), 1253 deletions(-)
copy source4/echo_server/echo_server.h => source3/librpc/rpc/dcerpc_internal.h
(64%)
Changeset truncated at 500 lines:
diff --git a/VERSION b/VERSION
index 68f898ae004..4fff7d5eb09 100644
--- a/VERSION
+++ b/VERSION
@@ -27,7 +27,7 @@ SAMBA_COPYRIGHT_STRING="Copyright Andrew Tridgell and the
Samba Team 1992-2024"
########################################################
SAMBA_VERSION_MAJOR=4
SAMBA_VERSION_MINOR=21
-SAMBA_VERSION_RELEASE=6
+SAMBA_VERSION_RELEASE=7
########################################################
# If a official release has a serious bug #
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index b8967d54c82..127fd8a3811 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -1,3 +1,85 @@
+ ==============================
+ Release Notes for Samba 4.21.7
+ July 07, 2025
+ ==============================
+
+
+This is the latest stable release of the Samba 4.21 release series.
+
+
+Important Change in Upcoming Microsoft Update
+---------------------------------------------
+
+On 8th of July, Microsoft will release an important security update for
+Active Directory Domain Controllers for Windows Server versions prior to
+2025.
+
+This update includes a change to the Microsoft RPC Netlogon protocol,
+which improves security by tightening access checks for a set of RPC
+requests. Samba running as domain members in these environments will be
+impacted by this change if a specific configuration is used, see below
+for which configuration is affected.
+
+Windows Server version 2025 is already equipped with these specific
+security hardenings, and Microsoft is now planning to deploy them to all
+supported Windows Server versions down to Windows Server 2008.
+
+
+Who is affected?
+
+Samba installations acting as member servers in Windows AD domains will
+be affected if they are configured to use the 'ad' idmapping backend.
+Samba servers not using this configuration will not be affected by the
+change – at least to our current knowledge and understanding of the
+change – and no further action is required.
+
+Current versions of Samba with the affected configuration will no longer
+function correctly once the Microsoft update has been applied. Users
+will not be able to connect to the SMB service provided by Samba for any
+domain configured to use the 'ad' idmapping backend.
+
+See https://bugzilla.samba.org/show_bug.cgi?id=15876.
+
+Changes since 4.21.6
+--------------------
+
+o Günther Deschner <[email protected]>
+ * BUG 15876: Windows security hardening locks out schannel'ed netlogon dc
+ calls like netr_DsRGetDCName.
+
+o Stefan Metzmacher <[email protected]>
+ * BUG 15680: Trust domains are not created.
+ * BUG 15876: Windows security hardening locks out schannel'ed netlogon dc
+ calls like netr_DsRGetDCName.
+
+o Andreas Schneider <[email protected]>
+ * BUG 15680: Trust domains are not created.
+ * BUG 15869: Startup messages of rpc deamons fills /var/log/messages.
+
+
+#######################################
+Reporting bugs & Development Discussion
+#######################################
+
+Please discuss this release on the samba-technical mailing list or by
+joining the #samba-technical:matrix.org matrix room, or
+#samba-technical IRC channel on irc.libera.chat.
+
+If you do report problems then please try to send high quality
+feedback. If you don't provide vital information to help us track down
+the problem then you will probably be ignored. All bug reports should
+be filed under the Samba 4.1 and newer product in the project's Bugzilla
+database (https://bugzilla.samba.org/).
+
+
+======================================================================
+== Our Code, Our Bugs, Our Responsibility.
+== The Samba Team
+======================================================================
+
+
+Release notes for older releases follow:
+----------------------------------------
==============================
Release Notes for Samba 4.21.6
June 03, 2025
@@ -92,8 +174,7 @@ database (https://bugzilla.samba.org/).
======================================================================
-Release notes for older releases follow:
-----------------------------------------
+----------------------------------------------------------------------
==============================
Release Notes for Samba 4.21.5
March 31, 2025
diff --git a/lib/util/debug.c b/lib/util/debug.c
index 86f13f181cf..f79b8811a4b 100644
--- a/lib/util/debug.c
+++ b/lib/util/debug.c
@@ -95,6 +95,7 @@ static struct {
bool reopening_logs;
bool schedule_reopen_logs;
int forced_log_priority;
+ bool disable_syslog;
struct debug_settings settings;
debug_callback_fn callback;
@@ -302,6 +303,10 @@ static void debug_syslog_log(int msg_level, const char
*msg, size_t msg_len)
{
int priority;
+ if (state.disable_syslog) {
+ return;
+ }
+
priority = debug_level_to_priority(msg_level);
/*
@@ -1124,6 +1129,16 @@ void debug_set_forced_log_priority(int
forced_log_priority)
state.forced_log_priority = forced_log_priority;
}
+void debug_disable_syslog(void)
+{
+ state.disable_syslog = true;
+}
+
+void debug_enable_syslog(void)
+{
+ state.disable_syslog = false;
+}
+
/**
* Ensure debug logs are initialised.
*
diff --git a/lib/util/debug.h b/lib/util/debug.h
index a4ad56048ff..5dc36369558 100644
--- a/lib/util/debug.h
+++ b/lib/util/debug.h
@@ -276,9 +276,16 @@ void debuglevel_set_class(size_t idx, int level);
#define DBGLVL_INFO 5 /* informational message */
#define DBGLVL_DEBUG 10 /* debug-level message */
+/*
+ * Logging to syslog will be disabled as messages on debug level 0 are always
+ * reported to syslog too. We don't want to clutter the syslog with startup
+ * messages from rpc on demand daemons.
+ */
#define DBG_STARTUP_NOTICE(...) do { \
debug_set_forced_log_priority(DBGLVL_NOTICE); \
+ debug_disable_syslog(); \
D_ERR(__VA_ARGS__); \
+ debug_enable_syslog(); \
debug_set_forced_log_priority(-1); \
} while(0)
@@ -362,6 +369,8 @@ void debug_set_settings(struct debug_settings *settings,
int syslog_level, bool syslog_only);
void debug_set_hostname(const char *name);
void debug_set_forced_log_priority(int forced_log_priority);
+void debug_disable_syslog(void);
+void debug_enable_syslog(void);
bool reopen_logs_internal( void );
void force_check_log_size( void );
bool need_to_check_log_size( void );
diff --git a/libcli/tstream_binding_handle/tstream_binding_handle.c
b/libcli/tstream_binding_handle/tstream_binding_handle.c
index 76f54a7f338..672fd3b89c6 100644
--- a/libcli/tstream_binding_handle/tstream_binding_handle.c
+++ b/libcli/tstream_binding_handle/tstream_binding_handle.c
@@ -35,8 +35,17 @@ struct tstream_bh_state {
size_t call_initial_read_size;
tstream_read_pdu_blob_full_fn_t *complete_pdu_fn;
void *complete_pdu_fn_private;
+ const struct dcerpc_binding *binding;
};
+static const struct dcerpc_binding *tstream_bh_get_binding(struct
dcerpc_binding_handle *h)
+{
+ struct tstream_bh_state *hs = dcerpc_binding_handle_data(
+ h, struct tstream_bh_state);
+
+ return hs->binding;
+}
+
static bool tstream_bh_is_connected(struct dcerpc_binding_handle *h)
{
struct tstream_bh_state *hs = dcerpc_binding_handle_data(
@@ -290,6 +299,7 @@ static NTSTATUS tstream_bh_call_recv(struct tevent_req *req,
static const struct dcerpc_binding_handle_ops tstream_bh_ops = {
.name = "tstream_binding_handle",
+ .get_binding = tstream_bh_get_binding,
.is_connected = tstream_bh_is_connected,
.set_timeout = tstream_bh_set_timeout,
.raw_call_send = tstream_bh_call_send,
@@ -309,6 +319,8 @@ struct dcerpc_binding_handle *tstream_binding_handle_create(
{
struct dcerpc_binding_handle *h = NULL;
struct tstream_bh_state *hs = NULL;
+ struct dcerpc_binding *b = NULL;
+ NTSTATUS status;
h = dcerpc_binding_handle_create(mem_ctx,
&tstream_bh_ops,
@@ -333,6 +345,13 @@ struct dcerpc_binding_handle
*tstream_binding_handle_create(
return NULL;
}
+ status = dcerpc_parse_binding(hs, "", &b);
+ if (!NT_STATUS_IS_OK(status)) {
+ TALLOC_FREE(h);
+ return NULL;
+ }
+ hs->binding = b;
+
if (max_data > 0) {
tstream_smbXcli_np_set_max_data(hs->stream, max_data);
}
diff --git a/librpc/rpc/binding_handle.c b/librpc/rpc/binding_handle.c
index 41675e10360..8ace6722a43 100644
--- a/librpc/rpc/binding_handle.c
+++ b/librpc/rpc/binding_handle.c
@@ -87,6 +87,17 @@ void dcerpc_binding_handle_set_sync_ev(struct
dcerpc_binding_handle *h,
h->sync_ev = ev;
}
+const struct dcerpc_binding *dcerpc_binding_handle_get_binding(struct
dcerpc_binding_handle *h)
+{
+ return h->ops->get_binding(h);
+}
+
+enum dcerpc_transport_t dcerpc_binding_handle_get_transport(struct
dcerpc_binding_handle *h)
+{
+ const struct dcerpc_binding *b = dcerpc_binding_handle_get_binding(h);
+ return dcerpc_binding_get_transport(b);
+}
+
bool dcerpc_binding_handle_is_connected(struct dcerpc_binding_handle *h)
{
return h->ops->is_connected(h);
@@ -98,6 +109,27 @@ uint32_t dcerpc_binding_handle_set_timeout(struct
dcerpc_binding_handle *h,
return h->ops->set_timeout(h, timeout);
}
+bool dcerpc_binding_handle_transport_encrypted(struct dcerpc_binding_handle *h)
+{
+ if (h->ops->transport_encrypted == NULL) {
+ return false;
+ }
+
+ return h->ops->transport_encrypted(h);
+}
+
+NTSTATUS dcerpc_binding_handle_transport_session_key(
+ struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key)
+{
+ if (h->ops->transport_session_key == NULL) {
+ return NT_STATUS_NO_USER_SESSION_KEY;
+ }
+
+ return h->ops->transport_session_key(h, mem_ctx, session_key);
+}
+
void dcerpc_binding_handle_auth_info(struct dcerpc_binding_handle *h,
enum dcerpc_AuthType *auth_type,
enum dcerpc_AuthLevel *auth_level)
@@ -123,6 +155,18 @@ void dcerpc_binding_handle_auth_info(struct
dcerpc_binding_handle *h,
h->ops->auth_info(h, auth_type, auth_level);
}
+NTSTATUS dcerpc_binding_handle_auth_session_key(
+ struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key)
+{
+ if (h->ops->auth_session_key == NULL) {
+ return NT_STATUS_NO_USER_SESSION_KEY;
+ }
+
+ return h->ops->auth_session_key(h, mem_ctx, session_key);
+}
+
struct dcerpc_binding_handle_raw_call_state {
const struct dcerpc_binding_handle_ops *ops;
uint8_t *out_data;
diff --git a/librpc/rpc/dcerpc_error.c b/librpc/rpc/dcerpc_error.c
index d5b5b66ab6a..26c96336615 100644
--- a/librpc/rpc/dcerpc_error.c
+++ b/librpc/rpc/dcerpc_error.c
@@ -40,9 +40,9 @@ static const struct dcerpc_fault_table dcerpc_faults[] =
_FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_YOU_CRASHED),
_FAULT_STR(DCERPC_NCA_S_PROTO_ERROR, NT_STATUS_RPC_PROTOCOL_ERROR),
_FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_OUT_ARGS_TOO_BIG),
- _FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_SERVER_TOO_BUSY),
+ _FAULT_STR(DCERPC_NCA_S_SERVER_TOO_BUSY, NT_STATUS_RPC_SERVER_TOO_BUSY),
_FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_FAULT_STRING_TOO_LARGE),
- _FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_UNSUPPORTED_TYPE),
+ _FAULT_STR(DCERPC_NCA_S_UNSUPPORTED_TYPE,
NT_STATUS_RPC_UNSUPPORTED_TYPE),
_FAULT_STR_NO_NT_MAPPING(DCERPC_NCA_S_FAULT_ADDR_ERROR),
_FAULT_STR(DCERPC_NCA_S_FAULT_FP_DIV_BY_ZERO,
NT_STATUS_RPC_FP_DIV_ZERO),
_FAULT_STR(DCERPC_NCA_S_FAULT_FP_UNDERFLOW, NT_STATUS_RPC_FP_UNDERFLOW),
diff --git a/librpc/rpc/dcerpc_util.c b/librpc/rpc/dcerpc_util.c
index 51a8a11ac4a..e01391e6dcd 100644
--- a/librpc/rpc/dcerpc_util.c
+++ b/librpc/rpc/dcerpc_util.c
@@ -647,13 +647,13 @@ NTSTATUS dcerpc_read_ncacn_packet_recv(struct tevent_req
*req,
return NT_STATUS_OK;
}
-const char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx,
- enum dcerpc_transport_t transport,
- const struct ndr_interface_table
*table)
+char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx,
+ enum dcerpc_transport_t transport,
+ const struct ndr_interface_table *table)
{
NTSTATUS status;
const char *p = NULL;
- const char *endpoint = NULL;
+ char *endpoint = NULL;
uint32_t i;
struct dcerpc_binding *default_binding = NULL;
TALLOC_CTX *frame = talloc_stackframe();
diff --git a/librpc/rpc/dcerpc_util.h b/librpc/rpc/dcerpc_util.h
index 4e49e3e8572..86c254e539c 100644
--- a/librpc/rpc/dcerpc_util.h
+++ b/librpc/rpc/dcerpc_util.h
@@ -36,9 +36,9 @@ uint8_t dcerpc_get_endian_flag(DATA_BLOB *blob);
uint8_t dcerpc_get_auth_type(const DATA_BLOB *blob);
uint8_t dcerpc_get_auth_level(const DATA_BLOB *blob);
uint32_t dcerpc_get_auth_context_id(const DATA_BLOB *blob);
-const char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx,
- enum dcerpc_transport_t transport,
- const struct ndr_interface_table
*table);
+char *dcerpc_default_transport_endpoint(TALLOC_CTX *mem_ctx,
+ enum dcerpc_transport_t transport,
+ const struct ndr_interface_table
*table);
NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx,
const DATA_BLOB *blob,
diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c
index 66478001640..7fb23d49d61 100644
--- a/librpc/rpc/dcesrv_core.c
+++ b/librpc/rpc/dcesrv_core.c
@@ -783,8 +783,8 @@ static void dcesrv_call_set_list(struct dcesrv_call_state
*call,
}
}
-static void dcesrv_call_disconnect_after(struct dcesrv_call_state *call,
- const char *reason)
+void dcesrv_call_disconnect_after(struct dcesrv_call_state *call,
+ const char *reason)
{
struct dcesrv_auth *a = NULL;
diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h
index 90f5bd21d64..0b69af575b2 100644
--- a/librpc/rpc/dcesrv_core.h
+++ b/librpc/rpc/dcesrv_core.h
@@ -566,6 +566,9 @@ NTSTATUS dcesrv_auth_session_key(struct dcesrv_call_state
*call,
NTSTATUS dcesrv_transport_session_key(struct dcesrv_call_state *call,
DATA_BLOB *session_key);
+void dcesrv_call_disconnect_after(struct dcesrv_call_state *call,
+ const char *reason);
+
/* a useful macro for generating a RPC fault in the backend code */
#define DCESRV_FAULT(code) do { \
dce_call->fault_code = code; \
diff --git a/librpc/rpc/rpc_common.h b/librpc/rpc/rpc_common.h
index 76557101dcd..493c3137126 100644
--- a/librpc/rpc/rpc_common.h
+++ b/librpc/rpc/rpc_common.h
@@ -172,13 +172,23 @@ enum dcerpc_transport_t dcerpc_transport_by_tower(const
struct epm_tower *tower)
struct dcerpc_binding_handle_ops {
const char *name;
+ const struct dcerpc_binding *(*get_binding)(struct
dcerpc_binding_handle *h);
+
bool (*is_connected)(struct dcerpc_binding_handle *h);
uint32_t (*set_timeout)(struct dcerpc_binding_handle *h,
uint32_t timeout);
+ bool (*transport_encrypted)(struct dcerpc_binding_handle *h);
+ NTSTATUS (*transport_session_key)(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key);
+
void (*auth_info)(struct dcerpc_binding_handle *h,
enum dcerpc_AuthType *auth_type,
enum dcerpc_AuthLevel *auth_level);
+ NTSTATUS (*auth_session_key)(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key);
struct tevent_req *(*raw_call_send)(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
@@ -245,15 +255,31 @@ void *_dcerpc_binding_handle_data(struct
dcerpc_binding_handle *h);
_DEPRECATED_ void dcerpc_binding_handle_set_sync_ev(struct
dcerpc_binding_handle *h,
struct tevent_context *ev);
+const struct dcerpc_binding *dcerpc_binding_handle_get_binding(struct
dcerpc_binding_handle *h);
+
+enum dcerpc_transport_t dcerpc_binding_handle_get_transport(struct
dcerpc_binding_handle *h);
+
bool dcerpc_binding_handle_is_connected(struct dcerpc_binding_handle *h);
uint32_t dcerpc_binding_handle_set_timeout(struct dcerpc_binding_handle *h,
uint32_t timeout);
+bool dcerpc_binding_handle_transport_encrypted(struct dcerpc_binding_handle
*h);
+
+NTSTATUS dcerpc_binding_handle_transport_session_key(
+ struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key);
+
void dcerpc_binding_handle_auth_info(struct dcerpc_binding_handle *h,
enum dcerpc_AuthType *auth_type,
enum dcerpc_AuthLevel *auth_level);
+NTSTATUS dcerpc_binding_handle_auth_session_key(
+ struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ DATA_BLOB *session_key);
+
struct tevent_req *dcerpc_binding_handle_raw_call_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct dcerpc_binding_handle *h,
diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm
b/pidl/lib/Parse/Pidl/Samba4/Python.pm
index 63f0f72605d..9bcdea3b15b 100644
--- a/pidl/lib/Parse/Pidl/Samba4/Python.pm
+++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm
@@ -1547,11 +1547,30 @@ sub Interface($$$)
$self->pidl("");
my $signature =
-"\"$interface->{NAME}(binding, lp_ctx=None, credentials=None) ->
connection\\n\"
-\"\\n\"
-\"binding should be a DCE/RPC binding string (for example:
ncacn_ip_tcp:127.0.0.1)\\n\"
-\"lp_ctx should be a path to a smb.conf file or a param.LoadParm object\\n\"
-\"credentials should be a credentials.Credentials object.\\n\\n\"";
+"\"$interface->{NAME}(binding, lp_ctx=None, credentials=None,
basis_connection=None) -> connection\\n\"
+\"\\n\\n\"
+\"Parameters\\n\"
+\"----------\\n\"
+\"binding : str\\n\"
+\" A DCE/RPC binding string (for example: ncacn_ip_tcp:127.0.0.1)\\n\"
+\"lp_ctx : param.LoadParm\\n\"
+\" Should be a path to a smb.conf file or a param.LoadParm object\\n\"
+\"credentials : credentials.Credentials, optional\\n\"
+\" A credentials.Credentials object (default is None).\\n\"
+\"basis_connection : samba.dcerpc.ClientConnection, optional\\n\"
+\" A $interface->{NAME} client connection object (default is None).\\n\"
+\"\\n\\n\"
+\"Returns\\n\"
+\"-------\\n\"
+\"samba.dcerpc.ClientConnection\\n\"
+\" A ClientConnection object\\n\"
+\"\\n\\n\"
+\"Raises\\n\"
+\"------\\n\"
+\"samba.NTSTATUSError\\n\"
+\" An NTSTATUS error\\n\"
+\"\\n\"";
+
my $docstring = $self->DocString($interface,
$interface->{NAME});
diff --git a/python/samba/lsa_utils.py b/python/samba/lsa_utils.py
index 043e65f3341..506dc399c93 100644
--- a/python/samba/lsa_utils.py
+++ b/python/samba/lsa_utils.py
@@ -20,24 +20,27 @@ from samba.dcerpc import lsa, drsblobs, misc
from samba.ndr import ndr_pack
from samba import (
NTSTATUSError,
+ ntstatus,
aead_aes_256_cbc_hmac_sha512,
arcfour_encrypt,
--
Samba Shared Repository