|
|
01d2b2 |
From b59b9c87042cb8f4d99421e101349c5f48f91235 Mon Sep 17 00:00:00 2001
|
|
|
01d2b2 |
From: Alexander Bokovoy <abokovoy@redhat.com>
|
|
|
01d2b2 |
Date: Tue, 26 Jul 2016 18:11:53 +0300
|
|
|
01d2b2 |
Subject: [PATCH 6/8] back-sch: do not clobber target of the pblock for idview
|
|
|
01d2b2 |
|
|
|
01d2b2 |
When extracting idview all we care is the DN of new target.
|
|
|
01d2b2 |
We don't really use the rewritten target as a string anymore,
|
|
|
01d2b2 |
so there is no need to rewrite the string in the pblock.
|
|
|
01d2b2 |
|
|
|
01d2b2 |
This fixes a bug when running with 389-ds 1.3.5.10+ which is more
|
|
|
01d2b2 |
strict about modification of the values in pblock.
|
|
|
01d2b2 |
|
|
|
01d2b2 |
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1360245
|
|
|
01d2b2 |
---
|
|
|
01d2b2 |
src/back-sch.c | 43 ++++++++++++++++++++++---------------------
|
|
|
01d2b2 |
src/back-sch.h | 2 +-
|
|
|
01d2b2 |
2 files changed, 23 insertions(+), 22 deletions(-)
|
|
|
01d2b2 |
|
|
|
01d2b2 |
diff --git a/src/back-sch.c b/src/back-sch.c
|
|
|
01d2b2 |
index 0745329..e15988f 100644
|
|
|
01d2b2 |
--- a/src/back-sch.c
|
|
|
01d2b2 |
+++ b/src/back-sch.c
|
|
|
01d2b2 |
@@ -1652,6 +1652,8 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
struct backend_search_cbdata cbdata;
|
|
|
01d2b2 |
struct backend_staged_search *staged, *next;
|
|
|
01d2b2 |
int i, isroot, ret;
|
|
|
01d2b2 |
+ char *original_target = NULL;
|
|
|
01d2b2 |
+ char *target = NULL;
|
|
|
01d2b2 |
|
|
|
01d2b2 |
if (wrap_get_call_level() > 0) {
|
|
|
01d2b2 |
return 0;
|
|
|
01d2b2 |
@@ -1676,7 +1678,7 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
return 0;
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
|
|
|
01d2b2 |
- slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &cbdata.target);
|
|
|
01d2b2 |
+ slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &original_target);
|
|
|
01d2b2 |
slapi_pblock_get(pb, SLAPI_SEARCH_SCOPE, &cbdata.scope);
|
|
|
01d2b2 |
slapi_pblock_get(pb, SLAPI_SEARCH_SIZELIMIT, &cbdata.sizelimit);
|
|
|
01d2b2 |
slapi_pblock_get(pb, SLAPI_SEARCH_TIMELIMIT, &cbdata.timelimit);
|
|
|
01d2b2 |
@@ -1697,15 +1699,15 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
/* Okay, we can search. */
|
|
|
01d2b2 |
slapi_log_error(SLAPI_LOG_PLUGIN, cbdata.state->plugin_desc->spd_id,
|
|
|
01d2b2 |
"searching from \"%s\" for \"%s\" with scope %d%s\n",
|
|
|
01d2b2 |
- cbdata.target, cbdata.strfilter, cbdata.scope,
|
|
|
01d2b2 |
+ original_target, cbdata.strfilter, cbdata.scope,
|
|
|
01d2b2 |
backend_sch_scope_as_string(cbdata.scope));
|
|
|
01d2b2 |
- cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
|
|
|
01d2b2 |
+ cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
|
|
|
01d2b2 |
/* Check if there's a backend handling this search. */
|
|
|
01d2b2 |
if (!slapi_be_exist(cbdata.target_dn)) {
|
|
|
01d2b2 |
slapi_log_error(SLAPI_LOG_PLUGIN,
|
|
|
01d2b2 |
cbdata.state->plugin_desc->spd_id,
|
|
|
01d2b2 |
"slapi_be_exists(\"%s\") = 0, "
|
|
|
01d2b2 |
- "ignoring search\n", cbdata.target);
|
|
|
01d2b2 |
+ "ignoring search\n", original_target);
|
|
|
01d2b2 |
slapi_sdn_free(&cbdata.target_dn);
|
|
|
01d2b2 |
return 0;
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
@@ -1716,22 +1718,23 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
* detect the ID view use. Unless the ID view is within the set we control, don't consider the override */
|
|
|
01d2b2 |
map_data_foreach_domain(cbdata.state, backend_search_find_set_dn_cb, &cbdata);
|
|
|
01d2b2 |
if (cbdata.answer == FALSE) {
|
|
|
01d2b2 |
- idview_replace_target_dn(&cbdata.target, &cbdata.idview);
|
|
|
01d2b2 |
+ target = slapi_ch_strdup(original_target);
|
|
|
01d2b2 |
+ idview_replace_target_dn(&target, &cbdata.idview);
|
|
|
01d2b2 |
if (cbdata.idview != NULL) {
|
|
|
01d2b2 |
slapi_sdn_free(&cbdata.target_dn);
|
|
|
01d2b2 |
/* Perform another check, now for rewritten DN */
|
|
|
01d2b2 |
- cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
|
|
|
01d2b2 |
+ cbdata.target_dn = slapi_sdn_new_dn_byval(target);
|
|
|
01d2b2 |
map_data_foreach_domain(cbdata.state, backend_search_find_set_dn_cb, &cbdata);
|
|
|
01d2b2 |
/* Rewritten DN might still be outside of our trees */
|
|
|
01d2b2 |
if (cbdata.answer == TRUE) {
|
|
|
01d2b2 |
slapi_log_error(SLAPI_LOG_PLUGIN, cbdata.state->plugin_desc->spd_id,
|
|
|
01d2b2 |
"Use of ID view '%s' is detected, searching from \"%s\" "
|
|
|
01d2b2 |
"for \"%s\" with scope %d%s. Filter may get overridden later.\n",
|
|
|
01d2b2 |
- cbdata.idview, cbdata.target, cbdata.strfilter, cbdata.scope,
|
|
|
01d2b2 |
+ cbdata.idview, target, cbdata.strfilter, cbdata.scope,
|
|
|
01d2b2 |
backend_sch_scope_as_string(cbdata.scope));
|
|
|
01d2b2 |
} else {
|
|
|
01d2b2 |
slapi_sdn_free(&cbdata.target_dn);
|
|
|
01d2b2 |
- slapi_ch_free_string(&cbdata.target);
|
|
|
01d2b2 |
+ slapi_ch_free_string(&target);
|
|
|
01d2b2 |
slapi_ch_free_string(&cbdata.idview);
|
|
|
01d2b2 |
slapi_log_error(SLAPI_LOG_PLUGIN,
|
|
|
01d2b2 |
cbdata.state->plugin_desc->spd_id,
|
|
|
01d2b2 |
@@ -1739,6 +1742,8 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
"ignoring search\n");
|
|
|
01d2b2 |
return 0;
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
+ } else {
|
|
|
01d2b2 |
+ slapi_ch_free_string(&target);
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
cbdata.answer = FALSE;
|
|
|
01d2b2 |
@@ -1890,7 +1895,7 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
slapi_sdn_free(&cbdata.target_dn);
|
|
|
01d2b2 |
if (cbdata.idview != NULL) {
|
|
|
01d2b2 |
- slapi_ch_free_string(&cbdata.target);
|
|
|
01d2b2 |
+ slapi_ch_free_string(&target);
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
slapi_ch_free_string(&cbdata.idview);
|
|
|
01d2b2 |
#ifdef USE_IPA_IDVIEWS
|
|
|
01d2b2 |
@@ -1904,7 +1909,6 @@ backend_search_cb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
/* Locate the entry for a given DN. */
|
|
|
01d2b2 |
struct backend_locate_cbdata {
|
|
|
01d2b2 |
struct plugin_state *state;
|
|
|
01d2b2 |
- char *target;
|
|
|
01d2b2 |
Slapi_DN *target_dn;
|
|
|
01d2b2 |
|
|
|
01d2b2 |
struct backend_entry_data *entry_data;
|
|
|
01d2b2 |
@@ -1953,6 +1957,7 @@ static void
|
|
|
01d2b2 |
backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **group, const char**set)
|
|
|
01d2b2 |
{
|
|
|
01d2b2 |
struct backend_locate_cbdata cbdata;
|
|
|
01d2b2 |
+ char *original_target = NULL;
|
|
|
01d2b2 |
|
|
|
01d2b2 |
slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &cbdata.state);
|
|
|
01d2b2 |
if (cbdata.state->plugin_base == NULL) {
|
|
|
01d2b2 |
@@ -1960,9 +1965,9 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
|
|
|
01d2b2 |
*data = NULL;
|
|
|
01d2b2 |
return;
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &cbdata.target);
|
|
|
01d2b2 |
+ slapi_pblock_get(pb, SLAPI_TARGET_DN, &original_target);
|
|
|
01d2b2 |
|
|
|
01d2b2 |
- cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
|
|
|
01d2b2 |
+ cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
|
|
|
01d2b2 |
cbdata.entry_data = NULL;
|
|
|
01d2b2 |
cbdata.entry_group = NULL;
|
|
|
01d2b2 |
cbdata.entry_set = NULL;
|
|
|
01d2b2 |
@@ -1972,12 +1977,9 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
|
|
|
01d2b2 |
* rebuild the target's RDN to use original attribute's value */
|
|
|
01d2b2 |
if (cbdata.entry_data == NULL) {
|
|
|
01d2b2 |
char *idview = NULL;
|
|
|
01d2b2 |
- char *target, *original_target;
|
|
|
01d2b2 |
- target = original_target = slapi_ch_strdup(cbdata.target);
|
|
|
01d2b2 |
+ char *target = NULL;
|
|
|
01d2b2 |
+ target = slapi_ch_strdup(original_target);
|
|
|
01d2b2 |
idview_replace_target_dn(&target, &idview);
|
|
|
01d2b2 |
- if (target != original_target) {
|
|
|
01d2b2 |
- slapi_ch_free_string(&original_target);
|
|
|
01d2b2 |
- }
|
|
|
01d2b2 |
if (idview != NULL) {
|
|
|
01d2b2 |
char *rdnstr;
|
|
|
01d2b2 |
char *val;
|
|
|
01d2b2 |
@@ -1992,7 +1994,6 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
|
|
|
01d2b2 |
bval.bv_val = slapi_ch_strdup(val);
|
|
|
01d2b2 |
memset(&scbdata, 0, sizeof(scbdata));
|
|
|
01d2b2 |
scbdata.idview = idview;
|
|
|
01d2b2 |
- scbdata.target = target;
|
|
|
01d2b2 |
scbdata.pb = pb;
|
|
|
01d2b2 |
scbdata.state = cbdata.state;
|
|
|
01d2b2 |
scbdata.target_dn = slapi_sdn_new_dn_byval(target);
|
|
|
01d2b2 |
@@ -2025,7 +2026,6 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
|
|
|
01d2b2 |
* insufficient-access error. */
|
|
|
01d2b2 |
struct backend_group_check_scope_cbdata {
|
|
|
01d2b2 |
struct plugin_state *state;
|
|
|
01d2b2 |
- const char *target;
|
|
|
01d2b2 |
Slapi_DN *target_dn;
|
|
|
01d2b2 |
bool_t ours;
|
|
|
01d2b2 |
};
|
|
|
01d2b2 |
@@ -2050,14 +2050,15 @@ static bool_t
|
|
|
01d2b2 |
backend_check_scope_pb(Slapi_PBlock *pb)
|
|
|
01d2b2 |
{
|
|
|
01d2b2 |
struct backend_group_check_scope_cbdata cbdata;
|
|
|
01d2b2 |
+ char *original_target = NULL;
|
|
|
01d2b2 |
|
|
|
01d2b2 |
slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &cbdata.state);
|
|
|
01d2b2 |
if (cbdata.state->plugin_base == NULL) {
|
|
|
01d2b2 |
/* The plugin was not actually started. */
|
|
|
01d2b2 |
return FALSE;
|
|
|
01d2b2 |
}
|
|
|
01d2b2 |
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &cbdata.target);
|
|
|
01d2b2 |
- cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
|
|
|
01d2b2 |
+ slapi_pblock_get(pb, SLAPI_TARGET_DN, &original_target);
|
|
|
01d2b2 |
+ cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
|
|
|
01d2b2 |
cbdata.ours = FALSE;
|
|
|
01d2b2 |
map_data_foreach_domain(cbdata.state, backend_group_check_scope_cb,
|
|
|
01d2b2 |
&cbdata);
|
|
|
01d2b2 |
diff --git a/src/back-sch.h b/src/back-sch.h
|
|
|
01d2b2 |
index 1258ae0..9a9abc7 100644
|
|
|
01d2b2 |
--- a/src/back-sch.h
|
|
|
01d2b2 |
+++ b/src/back-sch.h
|
|
|
01d2b2 |
@@ -88,7 +88,7 @@ struct entries_to_send {
|
|
|
01d2b2 |
struct backend_search_cbdata {
|
|
|
01d2b2 |
Slapi_PBlock *pb;
|
|
|
01d2b2 |
struct plugin_state *state;
|
|
|
01d2b2 |
- char *target, *strfilter, **attrs;
|
|
|
01d2b2 |
+ char *strfilter, **attrs;
|
|
|
01d2b2 |
char *idview;
|
|
|
01d2b2 |
Slapi_Entry **overrides;
|
|
|
01d2b2 |
int scope, sizelimit, timelimit, attrsonly;
|
|
|
01d2b2 |
--
|
|
|
01d2b2 |
2.7.4
|
|
|
01d2b2 |
|