[SCM] Samba Shared Repository - branch master updated
Andrew Tridgell
tridge at samba.org
Fri Sep 17 03:01:53 MDT 2010
The branch, master has been updated
via 90d685a s4-devel: developer script for adding DNS entries via netlogon RPC
via fb81cc0 s4-pyrpc: allow python to access irpc interfaces
via 1c7c1a8 idl: build python interfaces for winbind and idmap IDL
via 39bd61e s4-winbind Add a proxy method to update DNS records with a read-write DC
from b772f4c testprogs: skip two tests in spoolss tester.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 90d685afe57e08ce7da575783c4d279e1be021f6
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Sep 17 17:06:29 2010 +1000
s4-devel: developer script for adding DNS entries via netlogon RPC
this calls the netlogon DsrUpdateReadOnlyServerDnsRecords call to add
DNS entries for a RODC via RPC calls. The call is routed via a IRPC
call to winbind, as winbind is the one with the schannel credential
chaining setup.
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit fb81cc080d40844010daae559e6be6a747c10ecd
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Sep 17 17:04:28 2010 +1000
s4-pyrpc: allow python to access irpc interfaces
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit 1c7c1a86ecf401f54b9462bb9d0946356ddb688d
Author: Andrew Tridgell <tridge at samba.org>
Date: Fri Sep 17 17:03:54 2010 +1000
idl: build python interfaces for winbind and idmap IDL
Pair-Programmed-With: Andrew Bartlett <abartlet at samba.org>
commit 39bd61e018d8495f9a7368d1656c6f52d422e6e3
Author: Andrew Bartlett <abartlet at samba.org>
Date: Fri Sep 17 10:11:48 2010 +1000
s4-winbind Add a proxy method to update DNS records with a read-write DC
This must be done in winbindd as it already has the schannel connection
and the credential chain. If we re-established that elsewhere, we
would break the chain in winbindd.
Andrew Bartlett
Signed-Off-By: Andrew Tridgell <tridge at samba.org>
-----------------------------------------------------------------------
Summary of changes:
librpc/idl/netlogon.idl | 2 +-
librpc/idl/wscript_build | 7 +-
source4/librpc/idl/winbind.idl | 5 +
source4/librpc/rpc/pyrpc.h | 10 ++
source4/librpc/rpc/pyrpc_util.c | 53 ++++++++--
source4/librpc/wscript_build | 12 +++
source4/scripting/devel/rodcdns | 43 ++++++++
source4/winbind/wb_irpc.c | 50 ++++++++++
source4/winbind/wb_server.h | 1 +
.../{wb_sam_logon.c => wb_update_rodc_dns.c} | 102 +++++++++-----------
source4/winbind/wscript_build | 2 +-
11 files changed, 219 insertions(+), 68 deletions(-)
create mode 100755 source4/scripting/devel/rodcdns
copy source4/winbind/{wb_sam_logon.c => wb_update_rodc_dns.c} (57%)
Changeset truncated at 500 lines:
diff --git a/librpc/idl/netlogon.idl b/librpc/idl/netlogon.idl
index 62d2af5..1685cf9 100644
--- a/librpc/idl/netlogon.idl
+++ b/librpc/idl/netlogon.idl
@@ -1715,7 +1715,7 @@ interface netlogon
uint32 status;
} NL_DNS_NAME_INFO;
- typedef struct {
+ typedef [public] struct {
uint32 count;
[size_is(count)] NL_DNS_NAME_INFO *names;
} NL_DNS_NAME_INFO_ARRAY;
diff --git a/librpc/idl/wscript_build b/librpc/idl/wscript_build
index e8723ce..b8d11ba 100644
--- a/librpc/idl/wscript_build
+++ b/librpc/idl/wscript_build
@@ -20,6 +20,11 @@ bld.SAMBA_PIDL_LIST('PIDL',
output_dir='../gen_ndr')
bld.SAMBA_PIDL_LIST('PIDL',
- 'rap.idl idmap.idl dnsp.idl ntprinting.idl',
+ 'idmap.idl',
+ options='--header --ndr-parser --client --python',
+ output_dir='../gen_ndr')
+
+bld.SAMBA_PIDL_LIST('PIDL',
+ 'rap.idl dnsp.idl ntprinting.idl',
options='--header --ndr-parser',
output_dir='../gen_ndr')
diff --git a/source4/librpc/idl/winbind.idl b/source4/librpc/idl/winbind.idl
index 849b816..f9bccb8 100644
--- a/source4/librpc/idl/winbind.idl
+++ b/source4/librpc/idl/winbind.idl
@@ -47,4 +47,9 @@ interface winbind
[in,out] [size_is(count)] id_map ids[]
);
+ NTSTATUS winbind_DsrUpdateReadOnlyServerDnsRecords(
+ [in,unique] [string,charset(UTF16)] uint16 *site_name,
+ [in] uint32 dns_ttl,
+ [in,out,ref] NL_DNS_NAME_INFO_ARRAY *dns_names
+ );
}
diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h
index fb5f35f..651f8f1 100644
--- a/source4/librpc/rpc/pyrpc.h
+++ b/source4/librpc/rpc/pyrpc.h
@@ -42,4 +42,14 @@ typedef struct {
struct dcerpc_binding_handle *binding_handle;
} dcerpc_InterfaceObject;
+
+/*
+ these prototypes should be generated by the python pidl backend, but
+ aren't yet. They are needed when one module that has python access
+ is accessed by another module
+ */
+union netr_LogonLevel *py_export_netr_LogonLevel(TALLOC_CTX *mem_ctx, int level, PyObject *in);
+union netr_Validation;
+PyObject *py_import_netr_Validation(TALLOC_CTX *mem_ctx, int level, union netr_Validation *in);
+
#endif /* _PYRPC_H_ */
diff --git a/source4/librpc/rpc/pyrpc_util.c b/source4/librpc/rpc/pyrpc_util.c
index f3911ee..ba42c08 100644
--- a/source4/librpc/rpc/pyrpc_util.c
+++ b/source4/librpc/rpc/pyrpc_util.c
@@ -28,6 +28,8 @@
#include "param/pyparam.h"
#include "auth/credentials/pycredentials.h"
#include "lib/events/events.h"
+#include "lib/messaging/messaging.h"
+#include "lib/messaging/irpc.h"
#ifndef Py_TYPE /* Py_TYPE is only available on Python > 2.6 */
#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
@@ -65,7 +67,31 @@ bool py_check_dcerpc_type(PyObject *obj, const char *module, const char *typenam
return ret;
}
-PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs, const struct ndr_interface_table *table)
+/*
+ connect to a IRPC pipe from python
+ */
+static NTSTATUS pyrpc_irpc_connect(TALLOC_CTX *mem_ctx, const char *irpc_server,
+ const struct ndr_interface_table *table,
+ struct tevent_context *event_ctx,
+ struct loadparm_context *lp_ctx,
+ struct dcerpc_binding_handle **binding_handle)
+{
+ struct messaging_context *msg;
+
+ msg = messaging_client_init(mem_ctx, lpcfg_messaging_path(mem_ctx, lp_ctx), event_ctx);
+ NT_STATUS_HAVE_NO_MEMORY(msg);
+
+ *binding_handle = irpc_binding_handle_by_name(mem_ctx, msg, irpc_server, table);
+ if (*binding_handle == NULL) {
+ talloc_free(msg);
+ return NT_STATUS_INVALID_PIPE_STATE;
+ }
+
+ return NT_STATUS_OK;
+}
+
+PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, PyObject *kwargs,
+ const struct ndr_interface_table *table)
{
dcerpc_InterfaceObject *ret;
const char *binding_string;
@@ -103,18 +129,17 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
talloc_free(mem_ctx);
return NULL;
}
- credentials = cli_credentials_from_py_object(py_credentials);
- if (credentials == NULL) {
- PyErr_SetString(PyExc_TypeError, "Expected credentials");
- talloc_free(mem_ctx);
- return NULL;
- }
+
ret = PyObject_New(dcerpc_InterfaceObject, type);
ret->mem_ctx = mem_ctx;
event_ctx = s4_event_context_init(ret->mem_ctx);
- if (py_basis != Py_None) {
+ if (strncmp(binding_string, "irpc:", 5) == 0) {
+ ret->pipe = NULL;
+ status = pyrpc_irpc_connect(ret->mem_ctx, binding_string+5, table,
+ event_ctx, lp_ctx, &ret->binding_handle);
+ } else if (py_basis != Py_None) {
struct dcerpc_pipe *base_pipe;
PyObject *py_base;
PyTypeObject *ClientConnection_Type;
@@ -144,6 +169,12 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
ret->pipe = talloc_steal(ret->mem_ctx, ret->pipe);
} else {
+ credentials = cli_credentials_from_py_object(py_credentials);
+ if (credentials == NULL) {
+ PyErr_SetString(PyExc_TypeError, "Expected credentials");
+ talloc_free(mem_ctx);
+ return NULL;
+ }
status = dcerpc_pipe_connect(event_ctx, &ret->pipe, binding_string,
table, credentials, event_ctx, lp_ctx);
}
@@ -153,8 +184,10 @@ PyObject *py_dcerpc_interface_init_helper(PyTypeObject *type, PyObject *args, Py
return NULL;
}
- ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
- ret->binding_handle = ret->pipe->binding_handle;
+ if (ret->pipe) {
+ ret->pipe->conn->flags |= DCERPC_NDR_REF_ALLOC;
+ ret->binding_handle = ret->pipe->binding_handle;
+ }
return (PyObject *)ret;
}
diff --git a/source4/librpc/wscript_build b/source4/librpc/wscript_build
index 06bd8a7..65e8260 100755
--- a/source4/librpc/wscript_build
+++ b/source4/librpc/wscript_build
@@ -764,6 +764,18 @@ bld.SAMBA_PYTHON('python_irpc',
realname='samba/dcerpc/irpc.so'
)
+bld.SAMBA_PYTHON('python_winbind',
+ source='gen_ndr/py_winbind.c',
+ deps='RPC_NDR_WINBIND PYTALLOC pyrpc_util python_netlogon',
+ realname='samba/dcerpc/winbind.so'
+ )
+
+bld.SAMBA_PYTHON('python_idmap',
+ source='../../librpc/gen_ndr/py_idmap.c',
+ deps='NDR_IDMAP PYTALLOC pyrpc_util',
+ realname='samba/dcerpc/idmap.so'
+ )
+
bld.SAMBA_PYTHON('python_drsuapi',
source='../../librpc/gen_ndr/py_drsuapi.c',
diff --git a/source4/scripting/devel/rodcdns b/source4/scripting/devel/rodcdns
new file mode 100755
index 0000000..bd24342
--- /dev/null
+++ b/source4/scripting/devel/rodcdns
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+# script to call a netlogon RODC DNS update
+
+import sys
+from optparse import OptionParser
+
+sys.path.insert(0, "bin/python")
+
+import samba
+import samba.getopt as options
+from samba.dcerpc import netlogon, winbind
+
+########### main code ###########
+if __name__ == "__main__":
+ parser = OptionParser("rodcdns [options]")
+ sambaopts = options.SambaOptions(parser)
+
+ parser.add_option("", "--weight", dest="weight", help="record weight", default=0, type='int')
+ parser.add_option("", "--priority", dest="priority", help="record priority", default=100, type='int')
+ parser.add_option("", "--port", dest="port", help="port number", default=389, type='int')
+ parser.add_option("", "--type", dest="type", help="record type", default=netlogon.NlDnsLdapAtSite, type='int')
+ parser.add_option("", "--site", dest="site", help="site name", default="Default-First-Site-Name")
+
+ (opts, args) = parser.parse_args()
+
+ lp = sambaopts.get_loadparm()
+
+ w = winbind.winbind("irpc:winbind_server", lp)
+
+ dns_names = netlogon.NL_DNS_NAME_INFO_ARRAY()
+ dns_names.count = 1
+ name = netlogon.NL_DNS_NAME_INFO()
+ name.type = opts.type
+ name.priority = opts.priority
+ name.weight = opts.weight
+ name.port = opts.port
+ name.dns_register = True
+ dns_names.names = [ name ]
+ site_name = opts.site.decode('utf-8')
+
+ ret_names = w.DsrUpdateReadOnlyServerDnsRecords(site_name, 600, dns_names)
+ print("Status: %u" % ret_names.names[0].status)
diff --git a/source4/winbind/wb_irpc.c b/source4/winbind/wb_irpc.c
index bfb31e6..1eed89f 100644
--- a/source4/winbind/wb_irpc.c
+++ b/source4/winbind/wb_irpc.c
@@ -71,6 +71,52 @@ static void wb_irpc_SamLogon_callback(struct composite_context *ctx)
irpc_send_reply(s->msg, status);
}
+struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state {
+ struct irpc_message *msg;
+ struct winbind_DsrUpdateReadOnlyServerDnsRecords *req;
+};
+
+static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct composite_context *ctx);
+
+static NTSTATUS wb_irpc_DsrUpdateReadOnlyServerDnsRecords(struct irpc_message *msg,
+ struct winbind_DsrUpdateReadOnlyServerDnsRecords *req)
+{
+ struct wbsrv_service *service = talloc_get_type(msg->private_data,
+ struct wbsrv_service);
+ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state *s;
+ struct composite_context *ctx;
+
+ DEBUG(5, ("wb_irpc_DsrUpdateReadOnlyServerDnsRecords called\n"));
+
+ s = talloc(msg, struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state);
+ NT_STATUS_HAVE_NO_MEMORY(s);
+
+ s->msg = msg;
+ s->req = req;
+
+ ctx = wb_update_rodc_dns_send(msg, service, req);
+ NT_STATUS_HAVE_NO_MEMORY(ctx);
+
+ ctx->async.fn = wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback;
+ ctx->async.private_data = s;
+
+ msg->defer_reply = true;
+ return NT_STATUS_OK;
+}
+
+static void wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback(struct composite_context *ctx)
+{
+ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state *s = talloc_get_type(ctx->async.private_data,
+ struct wb_irpc_DsrUpdateReadOnlyServerDnsRecords_state);
+ NTSTATUS status;
+
+ DEBUG(5, ("wb_irpc_DsrUpdateReadOnlyServerDnsRecords_callback called\n"));
+
+ status = wb_update_rodc_dns_recv(ctx, s, s->req);
+
+ irpc_send_reply(s->msg, status);
+}
+
struct wb_irpc_get_idmap_state {
struct irpc_message *msg;
struct winbind_get_idmap *req;
@@ -149,6 +195,10 @@ NTSTATUS wbsrv_init_irpc(struct wbsrv_service *service)
wb_irpc_SamLogon, service);
NT_STATUS_NOT_OK_RETURN(status);
+ status = IRPC_REGISTER(service->task->msg_ctx, winbind, WINBIND_DSRUPDATEREADONLYSERVERDNSRECORDS,
+ wb_irpc_DsrUpdateReadOnlyServerDnsRecords, service);
+ NT_STATUS_NOT_OK_RETURN(status);
+
status = IRPC_REGISTER(service->task->msg_ctx, winbind, WINBIND_GET_IDMAP,
wb_irpc_get_idmap, service);
NT_STATUS_NOT_OK_RETURN(status);
diff --git a/source4/winbind/wb_server.h b/source4/winbind/wb_server.h
index ddb77d0..f20bc0a 100644
--- a/source4/winbind/wb_server.h
+++ b/source4/winbind/wb_server.h
@@ -176,6 +176,7 @@ struct wbsrv_samba3_call {
struct netr_LMSessionKey;
struct netr_UserSessionKey;
struct winbind_SamLogon;
+struct winbind_DsrUpdateReadOnlyServerDnsRecords;
#include "winbind/wb_async_helpers.h"
#include "winbind/wb_proto.h"
diff --git a/source4/winbind/wb_sam_logon.c b/source4/winbind/wb_update_rodc_dns.c
similarity index 57%
copy from source4/winbind/wb_sam_logon.c
copy to source4/winbind/wb_update_rodc_dns.c
index 028871a..5ad2d0c 100644
--- a/source4/winbind/wb_sam_logon.c
+++ b/source4/winbind/wb_update_rodc_dns.c
@@ -1,22 +1,27 @@
-/*
+/*
Unix SMB/CIFS implementation.
- Do a netr_LogonSamLogon to a remote DC
+ Do a netr_DsrUpdateReadOnlyServerDnsRecords to a remote DC
+
+ Copyright (C) Andrew Bartlett 2010
+ Copyright (C) Andrew Tridgell 2010
+
+ based heavily on wb_sam_logon.c which is copyright:
Copyright (C) Volker Lendecke 2005
- Copyright (C) Andrew Bartlett <abartlet at samba.org> 2005
+ Copyright (C) Andrew Bartlett 2005
Copyright (C) Stefan Metzmacher 2006
-
+
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 3 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, see <http://www.gnu.org/licenses/>.
*/
@@ -30,35 +35,35 @@
#include "librpc/gen_ndr/ndr_netlogon_c.h"
#include "librpc/gen_ndr/winbind.h"
-struct wb_sam_logon_state {
+struct wb_update_rodc_dns_state {
struct composite_context *ctx;
- struct winbind_SamLogon *req;
+ struct winbind_DsrUpdateReadOnlyServerDnsRecords *req;
struct netlogon_creds_CredentialState *creds_state;
struct netr_Authenticator auth1, auth2;
TALLOC_CTX *r_mem_ctx;
- struct netr_LogonSamLogon r;
+ struct netr_DsrUpdateReadOnlyServerDnsRecords r;
};
-static void wb_sam_logon_recv_domain(struct composite_context *ctx);
-static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq);
+static void wb_update_rodc_dns_recv_domain(struct composite_context *ctx);
+static void wb_update_rodc_dns_recv_response(struct tevent_req *subreq);
/*
Find the connection to the DC (or find an existing connection)
*/
-struct composite_context *wb_sam_logon_send(TALLOC_CTX *mem_ctx,
+struct composite_context *wb_update_rodc_dns_send(TALLOC_CTX *mem_ctx,
struct wbsrv_service *service,
- struct winbind_SamLogon *req)
+ struct winbind_DsrUpdateReadOnlyServerDnsRecords *req)
{
struct composite_context *c, *creq;
- struct wb_sam_logon_state *s;
+ struct wb_update_rodc_dns_state *s;
c = composite_create(mem_ctx, service->task->event_ctx);
if (!c) return NULL;
- s = talloc_zero(c, struct wb_sam_logon_state);
+ s = talloc_zero(c, struct wb_update_rodc_dns_state);
if (composite_nomem(s, c)) return c;
s->ctx = c;
s->req = req;
@@ -66,18 +71,18 @@ struct composite_context *wb_sam_logon_send(TALLOC_CTX *mem_ctx,
c->private_data = s;
creq = wb_sid2domain_send(s, service, service->primary_sid);
- composite_continue(c, creq, wb_sam_logon_recv_domain, s);
+ composite_continue(c, creq, wb_update_rodc_dns_recv_domain, s);
return c;
}
/*
Having finished making the connection to the DC
- Send of a SamLogon request to authenticate a user.
+ Send of a DsrUpdateReadOnlyServerDnsRecords request to authenticate a user.
*/
-static void wb_sam_logon_recv_domain(struct composite_context *creq)
+static void wb_update_rodc_dns_recv_domain(struct composite_context *creq)
{
- struct wb_sam_logon_state *s = talloc_get_type(creq->async.private_data,
- struct wb_sam_logon_state);
+ struct wb_update_rodc_dns_state *s = talloc_get_type(creq->async.private_data,
+ struct wb_update_rodc_dns_state);
struct wbsrv_domain *domain;
struct tevent_req *subreq;
@@ -93,45 +98,40 @@ static void wb_sam_logon_recv_domain(struct composite_context *creq)
s->r.in.computer_name = cli_credentials_get_workstation(domain->libnet_ctx->cred);
s->r.in.credential = &s->auth1;
- s->r.in.return_authenticator = &s->auth2;
- s->r.in.logon_level = s->req->in.logon_level;
- s->r.in.logon = &s->req->in.logon;
- s->r.in.validation_level = s->req->in.validation_level;
- s->r.out.return_authenticator = NULL;
- s->r.out.validation = talloc(s, union netr_Validation);
- if (composite_nomem(s->r.out.validation, s->ctx)) return;
- s->r.out.authoritative = talloc(s, uint8_t);
- if (composite_nomem(s->r.out.authoritative, s->ctx)) return;
-
+ s->r.out.return_authenticator = &s->auth2;
+ s->r.in.site_name = s->req->in.site_name;
+ s->r.in.dns_ttl = s->req->in.dns_ttl;
+ s->r.in.dns_names = s->req->in.dns_names;
+ s->r.out.dns_names = s->req->in.dns_names;
/*
- * use a new talloc context for the LogonSamLogon call
+ * use a new talloc context for the DsrUpdateReadOnlyServerDnsRecords call
* because then we can just to a talloc_steal on this context
* in the final _recv() function to give the caller all the content of
- * the s->r.out.validation
+ * the s->r.out.dns_names
*/
s->r_mem_ctx = talloc_new(s);
if (composite_nomem(s->r_mem_ctx, s->ctx)) return;
- subreq = dcerpc_netr_LogonSamLogon_r_send(s,
+ subreq = dcerpc_netr_DsrUpdateReadOnlyServerDnsRecords_r_send(s,
s->ctx->event_ctx,
domain->netlogon_pipe->binding_handle,
&s->r);
if (composite_nomem(subreq, s->ctx)) return;
- tevent_req_set_callback(subreq, wb_sam_logon_recv_samlogon, s);
+ tevent_req_set_callback(subreq, wb_update_rodc_dns_recv_response, s);
}
-/*
- NTLM Authentication
-
- Check the SamLogon reply and decrypt the session keys
+/*
+ NTLM Authentication
+
+ Check the DsrUpdateReadOnlyServerDnsRecords reply and decrypt the session keys
*/
-static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq)
+static void wb_update_rodc_dns_recv_response(struct tevent_req *subreq)
{
- struct wb_sam_logon_state *s = tevent_req_callback_data(subreq,
- struct wb_sam_logon_state);
+ struct wb_update_rodc_dns_state *s = tevent_req_callback_data(subreq,
+ struct wb_update_rodc_dns_state);
- s->ctx->status = dcerpc_netr_LogonSamLogon_r_recv(subreq, s->r_mem_ctx);
+ s->ctx->status = dcerpc_netr_DsrUpdateReadOnlyServerDnsRecords_r_recv(subreq, s->r_mem_ctx);
TALLOC_FREE(subreq);
if (!composite_is_ok(s->ctx)) return;
@@ -146,28 +146,20 @@ static void wb_sam_logon_recv_samlogon(struct tevent_req *subreq)
return;
}
- /* Decrypt the session keys before we reform the info3, so the
- * person on the other end of winbindd pipe doesn't have to.
- * They won't have the encryption key anyway */
- netlogon_creds_decrypt_samlogon(s->creds_state,
- s->r.in.validation_level,
- s->r.out.validation);
-
composite_done(s->ctx);
}
-NTSTATUS wb_sam_logon_recv(struct composite_context *c,
--
Samba Shared Repository
More information about the samba-cvs
mailing list