From: Gary Lockyer Date: Wed, 4 Apr 2018 00:39:55 +0000 (+1200) Subject: dsdb: pass the remote address to samdb connect X-Git-Tag: ldb-1.4.0~369 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=daa7b60a60520c94367e9112246482bae71c5ccd;p=thirdparty%2Fsamba.git dsdb: pass the remote address to samdb connect Signed-off-by: Gary Lockyer Reviewed-by: Andrew Bartlett --- diff --git a/source3/passdb/pdb_samba_dsdb.c b/source3/passdb/pdb_samba_dsdb.c index 05052a66361..f48f1fd1069 100644 --- a/source3/passdb/pdb_samba_dsdb.c +++ b/source3/passdb/pdb_samba_dsdb.c @@ -3893,7 +3893,7 @@ static NTSTATUS pdb_init_samba_dsdb(struct pdb_methods **pdb_method, state->lp_ctx, system_session(state->lp_ctx), 0, location, - &state->ldb, &errstring); + NULL, &state->ldb, &errstring); if (!state->ldb) { DEBUG(0, ("samdb_connect failed: %s: %s\n", diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c index cf171cb6608..17afd1fa850 100644 --- a/source4/dns_server/dlz_bind9.c +++ b/source4/dns_server/dlz_bind9.c @@ -706,7 +706,7 @@ _PUBLIC_ isc_result_t dlz_create(const char *dlzname, ret = samdb_connect_url(state, state->ev_ctx, state->lp, system_session(state->lp), 0, state->options.url, - &state->samdb, &errstring); + NULL, &state->samdb, &errstring); if (ret != LDB_SUCCESS) { state->log(ISC_LOG_ERROR, "samba_dlz: Failed to connect to %s: %s", diff --git a/source4/dsdb/samdb/samdb.c b/source4/dsdb/samdb/samdb.c index 1f80267e3e0..7a1bb79b636 100644 --- a/source4/dsdb/samdb/samdb.c +++ b/source4/dsdb/samdb/samdb.c @@ -42,6 +42,7 @@ #include "auth/credentials/credentials.h" #include "param/secrets.h" #include "auth/auth.h" +#include "lib/tsocket/tsocket.h" /* connect to the SAM database specified by URL @@ -51,7 +52,9 @@ int samdb_connect_url(TALLOC_CTX *mem_ctx, struct tevent_context *ev_ctx, struct loadparm_context *lp_ctx, struct auth_session_info *session_info, - unsigned int flags, const char *url, + unsigned int flags, + const char *url, + struct tsocket_address *remote_address, struct ldb_context **ldb_ret, char **errstring) { @@ -59,13 +62,17 @@ int samdb_connect_url(TALLOC_CTX *mem_ctx, int ret; *ldb_ret = NULL; *errstring = NULL; - ldb = ldb_wrap_find(url, ev_ctx, lp_ctx, session_info, NULL, flags); - if (ldb != NULL) { - *ldb_ret = talloc_reference(mem_ctx, ldb); - if (*ldb_ret == NULL) { - return LDB_ERR_OPERATIONS_ERROR; + + if (remote_address == NULL) { + ldb = ldb_wrap_find(url, ev_ctx, lp_ctx, + session_info, NULL, flags); + if (ldb != NULL) { + *ldb_ret = talloc_reference(mem_ctx, ldb); + if (*ldb_ret == NULL) { + return LDB_ERR_OPERATIONS_ERROR; + } + return LDB_SUCCESS; } - return LDB_SUCCESS; } ldb = samba_ldb_init(mem_ctx, ev_ctx, lp_ctx, session_info, NULL); @@ -91,6 +98,20 @@ int samdb_connect_url(TALLOC_CTX *mem_ctx, return LDB_ERR_OPERATIONS_ERROR; } + /* + * If a remote_address was specified, then set it on the DB + * and do not add to the wrap list (as we need to keep the LDB + * pointer unique for the address). + * + * We use this for audit logging and for the "netlogon" attribute + */ + if (remote_address != NULL) { + ldb_set_opaque(ldb, "remoteAddress", + remote_address); + *ldb_ret = ldb; + return LDB_SUCCESS; + } + if (!ldb_wrap_add(url, ev_ctx, lp_ctx, session_info, NULL, flags, ldb)) { *errstring = talloc_asprintf(mem_ctx, "Failed to add cached DB reference" @@ -118,7 +139,7 @@ struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx, char *errstring; struct ldb_context *ldb; int ret = samdb_connect_url(mem_ctx, ev_ctx, lp_ctx, session_info, flags, - "sam.ldb", &ldb, &errstring); + "sam.ldb", NULL, &ldb, &errstring); if (ret == LDB_SUCCESS) { return ldb; } diff --git a/source4/dsdb/samdb/samdb.h b/source4/dsdb/samdb/samdb.h index a095858d572..d2686af30f7 100644 --- a/source4/dsdb/samdb/samdb.h +++ b/source4/dsdb/samdb/samdb.h @@ -28,7 +28,7 @@ struct dsdb_extended_replicated_object; struct dsdb_extended_replicated_objects; struct loadparm_context; struct tevent_context; - +struct tsocket_address; struct dsdb_trust_routing_table; #include "librpc/gen_ndr/security.h" diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c index 95c7ee7a7f1..39f1aa2a2a6 100644 --- a/source4/ldap_server/ldap_backend.c +++ b/source4/ldap_server/ldap_backend.c @@ -31,6 +31,7 @@ #include #include #include "ldb_wrap.h" +#include "lib/tsocket/tsocket.h" static int map_ldb_error(TALLOC_CTX *mem_ctx, int ldb_err, const char *add_err_string, const char **errstring) @@ -188,7 +189,10 @@ int ldapsrv_backend_Init(struct ldapsrv_connection *conn, conn->lp_ctx, conn->session_info, conn->global_catalog ? LDB_FLG_RDONLY : 0, - "sam.ldb", &conn->ldb, errstring); + "sam.ldb", + conn->connection->remote_address, + &conn->ldb, + errstring); if (ret != LDB_SUCCESS) { return ret; } @@ -229,9 +233,6 @@ int ldapsrv_backend_Init(struct ldapsrv_connection *conn, ldb_set_opaque(conn->ldb, "supportedSASLMechanisms", sasl_mechs); } - ldb_set_opaque(conn->ldb, "remoteAddress", - conn->connection->remote_address); - return LDB_SUCCESS; } diff --git a/source4/torture/dns/dlz_bind9.c b/source4/torture/dns/dlz_bind9.c index 42b104e070c..d94848728fc 100644 --- a/source4/torture/dns/dlz_bind9.c +++ b/source4/torture/dns/dlz_bind9.c @@ -92,7 +92,9 @@ static isc_result_t dlz_bind9_writeable_zone_hook(dns_view_t *view, system_session(tctx->lp_ctx), 0, test_dlz_bind9_binddns_dir(tctx, "dns/sam.ldb"), - &samdb, &errstring); + NULL, + &samdb, + &errstring); struct ldb_message *msg; const char *attrs[] = { NULL